()在Haskell中意味着什么

Wys*_*ard 11 haskell

在一些Haskell代码中,我遇到了:

put :: s -> m ()
Run Code Online (Sandbox Code Playgroud)

()意味着什么?

我使用搜索引擎,但找不到()正确处理的搜索引擎.

pig*_*ker 34

()意思是"无聊".这意味着无聊的类型包含一件事,也很无聊.通过将无聊类型的一个元素与另一个元素进行比较,没有什么有趣的,因为通过给予它任何注意力,没有什么可以学习无聊类型的元素.

它与空类型非常不同,在Haskell中称为(我希望人们选择一个更好的名字,就像我建议的那样)Void.空的类型是非常令人兴奋的,因为如果有人给你一个属于它的价值,你知道你已经死了,在天堂,你想要的任何东西都是你的.

但如果有人给你一个价值(),不要兴奋.把它扔掉

有时采用由"元素类型"参数化的类型构造函数并用in填充参数很有趣().您可以看到类型构造函数中固有的信息,而不是来自元素.例如,Maybe ()是的一个版本Bool,与Just ()Nothing.此外,[()]相当于(可能是无限的)自然数:您拥有的唯一信息是长度.

所以,()意思是"无聊",但这通常是一个有趣的事情发生在其他地方的线索.

  • 你的建议是什么?`FALSE`?`Initial`?`Ridiculous`? (3认同)
  • 唯一的地方`()`是'安慰'而不是'无聊'将是[`rnf`](https://hackage.haskell.org/package/deepseq-1.4.1.2/docs/Control-DeepSeq.html ·V:RNF). (3认同)

dfe*_*uer 17

如果不是奇怪的特殊语法,它可以定义为

data () = ()
Run Code Online (Sandbox Code Playgroud)

它是关于最无聊的类型.语法应该让你想到元组:(a,b)是一对,(a,b,c)是三元组等,()是一个0元组.唯一缺少的是1元组,它不能具有该语法,因为它会与通常使用的括号冲突.

()经常被用作没有有趣结果的东西的结果.例如,IO应该执行某些I/O并在不产生结果的情况下终止的操作通常具有类型IO ().它也可以在你需要一些无趣的输入时使用; GHC对此有特殊的语法,但在Haskell 98中,模仿Lisp的方式cond是这样的:

case () of
  () | c1 -> e1
     | c2 -> e2
     ...
     | otherwise -> e3
Run Code Online (Sandbox Code Playgroud)

它是完全有效的,但也非常无聊,要问()你有什么类型的价值; 你可以拥有的只有一个合法的.

从"Haskell-as-almost-category"的观点来看,()最终的对象.也就是说,对于任何类型X,只有一种合法的类型函数X -> (),即const ().从另一个方向,Void类型pigworker提到是一个初始对象.对于任何类型X,只有一种合法的类型函数Void -> X,即absurd.如果您有分类推理的心情,初始和最终对象可能有用.


mip*_*adi 5

它被称为“单位类型”void在某些方面,您可以将其视为 Haskell 的 , 等价物。它是一种只有一个值(也是())的类型。

  • FTR,它是 Haskell 的等价物 _what C 类语言称为 `void`_ ......除了在这些语言中它根本不是真正的类型。此外,“void”有点用词不当,因为单位类型实际上不是空的。Haskell 也有一个 [`Void` 类型](http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Void.html),它真的是空的(这意味着,它的行为非常不同于`()` 或C 风格的`void`)。 (3认同)
  • Haskell 中的“Void”与 C 中的“void”以及 Agda 中的“()”与 Haskell 中的“()”的整个过程让我感到难过。当我在 Haskell 中提出现在是“Void”的类型时,我称它为“Zero”,如果仅通过计算其(非底部)居民的话,它会更令人回味。我(愉快地)惊讶它竟然在图书馆里。这是一个恶作剧,我的意思是我建议它作为一个笑话,但它也是实用的。 (3认同)
  • @pigworker:也许你的恶作剧 [需要变得不那么微妙](https://xkcd.com/516/)... - 我同意“零”对于一般程序员来说可能是一个不那么令人困惑的名字,但如果不是 C,`Void` 这个名字就完全没问题了。当然,如果 Haskell 因此命名自由 ADT 类型,那将是非常好的——特别是,`Either` 应该始终是 `+`! (2认同)

lef*_*out 5

有专门针对Haskell的优秀搜索引擎.

http://hayoo.fh-wedel.de/?query=()会立即给你正确答案:

Data ()
ghc-prim -GHC.Tuple


unit数据类型()有一个非undefined成员,nullary构造函数().