X
в трубах обычно пишется Void
в остальной экосистеме Haskell, поэтому давайте притворимся X = Void
. Он определяется следующим образом:
data Void
И это имеет «выпрямитель»
absurd :: Void -> a
absurd x = case x of {}
Если у вас есть что-то типа Void
(и заставить его), то что-то пошло не так. Ваша программа вызвала ошибку или застряла в бесконечном цикле.
Изготовление трубы Изделие вещи типа Void
запрещает это когда-либо производить что-либо (законное). Изготовление этого продукта типа ()
позволяет ему создавать вещи, но вещи, которые не содержат никакой информации. Они в основном часы.
На входной стороне трубка, которая потребляет вещи типа Void
, может ждать ввода, но как только она это сделает, она застряла - никто не сможет ее накормить. Труба, которая потребляет вещи типа ()
, может ждать, но только получает тики часов.
Все эти варианты являются разумными. Я подозреваю, что Гонсалес хотел, чтобы система типов запрещала пользователям случайно подключать чистого производителя к чистому потребителю неправильно, и получить ошибку, которую трудно отследить. Чистый производитель потребляет ()
, а чистый потребительский продукт Void
, он делает невозможным их неправильное подключение.
Возможно, вы захотите посмотреть на этот вопрос, а также на отличные ответы: «Что такое функция« absurd »в« Data.Void »?» (Http://stackoverflow.com/questions/14131856/ Whats-the-absurd-function-in-data-void-useful-for) –