为什么Haskell管道"使用()来关闭未使用的输入和X(无人居住的类型)以关闭未使用的输出"?

Ana*_*Ana 8 haskell haskell-pipes

Pipes Tutorial中,它说:

具体类型同义词用于()关闭未使用的输入和X(无人居住的类型)以关闭未使用的输出:

我想了解为什么()X使用它们的方式.为什么不X()的输入和输出?

dfe*_*uer 6

X在管道中通常拼写Void在Haskell生态系统的其余部分,所以让我们假装X = Void.它的定义如下:

data Void
Run Code Online (Sandbox Code Playgroud)

它有一个"消除器"

absurd :: Void -> a
absurd x = case x of {}
Run Code Online (Sandbox Code Playgroud)

如果你有类型的东西Void(并强制它),那么出现了问题.您的程序产生了错误,或者它陷入无限循环.

制作一个管子生产类型的东西Void它从生产任何东西(合法的).制作类型的东西()可以让它生产东西,但不带信息的东西.它们基本上是时钟滴答声.

在输入端,消耗类型的东西的管道Void可以等待输入,但是一旦它这样做它就会被卡住 - 没有人能够提供任何东西.消耗类型的东西的管道()可以等待,但只能获得时钟滴答.

所有这些选择都是合理的.我怀疑Gonzalez希望类型系统禁止用户以错误的方式意外地将纯粹的生产者连接到纯粹的消费者身上,并且获得可能难以追踪的错误.通过使纯粹的生产者消费()和纯粹的消费者生产Void,他使得不可能以错误的方式将他们联系起来.