Jedną z właściwości określających w lub pustym typu jest to, że istnieje funkcja dla każdego typu . W rzeczywistości istnieje unikalna taka funkcja. Jest zatem całkiem uzasadnione, aby ta funkcja była dostarczana jako część standardowej biblioteki. Często nazywa się to czymś w rodzaju . (W systemach z podtypów, może to być traktowane jedynie poprzez jest podtypem każdego typu. Następnie ukryte konwersji . Innym, sposobem jest określenie jako , który może być po prostu instancję do dowolny typ).⊥⊥ → AZA⊥ ⊥ ∀ α . αabsurd
⊥absurd
⊥∀ α . α
Zdecydowanie chcesz mieć taką funkcję lub jej odpowiednik, ponieważ pozwala ona korzystać z funkcji, które tworzą . Na przykład, powiedzmy, że mam podano typ suma . Robię na nim analizę przypadków, aw przypadku rzucę wyjątek za pomocą . W razie użyję . Ogólnie rzecz biorąc, chcę wartość typu , więc muszę coś zrobić, aby zamienić do . To pozwoliłoby mi to zrobić.⊥mi+ Amithrow:E→⊥Af:A→BB⊥Babsurd
Powiedział, że nie ma zbyt dużo rozumu, aby zdefiniować własne funkcje . Z definicji byłyby to koniecznie przypadki . Mimo to możesz to zrobić, jeśli nie jest to zapewnione przez bibliotekę standardową, lub potrzebujesz specjalizowanej wersji, która ułatwi sprawdzanie / wnioskowanie typu. Można jednak łatwo produkować funkcje, które zakończy się instancja do rodzaju jak .⊥→A⊥ → Aabsurd
absurd
⊥→A
Chociaż nie ma wiele powodów, by pisać taką funkcję, powinna ona być ogólnie dozwolona . Jednym z powodów jest to, że upraszcza narzędzia / makra do generowania kodu.
(x ? 3 : throw new Exception())
zostaje zastąpione do celów analizy czymś bardziej podobnym(x ? 3 : absurd(throw new Exception()))
?