发布于 2016-02-02 19:18:01
管道中的X通常在Haskell生态系统的其余部分中拼写为Void,所以让我们假装为X = Void。它的定义如下:
data Void它有一个“消除器”
absurd :: Void -> a
absurd x = case x of {}如果您有一些Void类型的东西(并强制它),那么有些东西出了问题。您的程序产生了一个错误,或者被困在一个无限循环中。
制造一个管道可以生产Void类型的东西,它永远不会生产任何东西(合法的)。让它产生()类型的东西,允许它产生东西,但是不带信息的东西。基本上是时钟滴答声。
在输入端,一个消耗Void类型的东西的管道可以等待输入,但是一旦它这样做,它就卡住了--没有人能给它提供任何东西。一个消耗()类型的东西的管道可以等待,但只能得到时钟滴答声。
所有这些选择都是合理的。我怀疑Gonzalez想让类型系统禁止用户不小心把一个纯生产者和一个纯粹的消费者联系在一起,并得到一个很难追踪的错误。通过让一个纯粹的生产者消费(),让一个纯粹的消费者生产Void,他使他们不可能以错误的方式连接起来。
发布于 2016-02-02 19:42:57
实际上,这不仅仅是对管道而言的一件普通事情。()和X是Hask类别(以及从Hask派生的类别的初始和终端对象 ),这意味着对于所有Haskell类型a,
a -> () (即const ())。X -> a (即absurd)。因此,任何函数链( a -> ()>>>() -> b )实际上都不能依赖于左部分(因为a -> ()不带任何信息),而任何链a -> X>>>X -> b都不能依赖右部分。从这个意义上说,() -> b输入是关闭的,a -> X输出也是如此。
https://stackoverflow.com/questions/35161616
复制相似问题