首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Haskell管道“使用()关闭未使用的输入,使用X(无人居住的类型)关闭未使用的输出”?

为什么Haskell管道“使用()关闭未使用的输入,使用X(无人居住的类型)关闭未使用的输出”?
EN

Stack Overflow用户
提问于 2016-02-02 18:55:40
回答 2查看 201关注 0票数 8

管道教程中,它说:

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

我想了解为什么()X是这样使用的。为什么不对输入和输出进行X()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-02 19:18:01

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

代码语言:javascript
复制
data Void

它有一个“消除器”

代码语言:javascript
复制
absurd :: Void -> a
absurd x = case x of {}

如果您有一些Void类型的东西(并强制它),那么有些东西出了问题。您的程序产生了一个错误,或者被困在一个无限循环中。

制造一个管道可以生产Void类型的东西,它永远不会生产任何东西(合法的)。让它产生()类型的东西,允许它产生东西,但是不带信息的东西。基本上是时钟滴答声。

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

所有这些选择都是合理的。我怀疑Gonzalez想让类型系统禁止用户不小心把一个纯生产者和一个纯粹的消费者联系在一起,并得到一个很难追踪的错误。通过让一个纯粹的生产者消费(),让一个纯粹的消费者生产Void,他使他们不可能以错误的方式连接起来。

票数 6
EN

Stack Overflow用户

发布于 2016-02-02 19:42:57

实际上,这不仅仅是对管道而言的一件普通事情。()XHask类别(以及从Hask派生的类别的初始和终端对象 ),这意味着对于所有Haskell类型a

  • 只有一个态射a -> () (即const ())。
  • 只有一个态射X -> a (即absurd)。

因此,任何函数链( a -> ()>>>() -> b )实际上都不能依赖于左部分(因为a -> ()不带任何信息),而任何链a -> X>>>X -> b都不能依赖右部分。从这个意义上说,() -> b输入是关闭的,a -> X输出也是如此。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35161616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档