X
w rurach jest zwykle napisane w innym ekosystemie Void
, udawajmy więc X = Void
. Jest zdefiniowany następująco:
data Void
I to ma „eliminator”
absurd :: Void -> a
absurd x = case x of {}
Jeśli masz coś typu Void
(i zmusić go), a następnie coś poszło nie tak. Twój program spowodował błąd lub utknął w nieskończonej pętli.
Wykonywanie rury produkuje rzeczy typu Void
umieszcza ją w dowolnym momencie (uzasadnione). Sprawiając, że produkuje on przedmioty typu ()
, pozwala produkować rzeczy, ale rzeczy, które nie niosą żadnych informacji. Zasadniczo są to tykanie zegara.
Po stronie wejściowej, rura, która zużywa przedmioty typu Void
może czekać na dane wejściowe, ale tak szybko, jak to zrobi, utknie - nikt nie będzie mógł go podać. Rura, która zużywa przedmioty typu ()
może czekać, ale dostaje tylko tyknięcia zegara.
Wszystkie te opcje są uzasadnione. Podejrzewam, że Gonzalez chciał, aby system typu zabraniał użytkownikom przypadkowego podłączenia czystego producenta do czystego konsumenta w niewłaściwy sposób i uzyskania błędu, który może być trudny do wyśledzenia. Poprzez zrobienie czystego producenta konsumuje się ()
, a czysty konsument produkuje Void
, uniemożliwia to podłączenie go w niewłaściwy sposób.
Może warto przyjrzeć się temu pytaniu, a także znakomitym odpowiedziom: ["Do czego służy funkcja' absurdu' w "Data.Void"?] (Http://stackoverflow.com/questions/14131856/ whats-the-absurdalna-funkcja-w-danych-void-użytecznych-for) –