为什么每种haskell类型都被取消(即被_ | _占据)?

时间:2019-07-27 16:46:39

标签: haskell

为什么每个非原始的haskell数据类型都被提升(即被_|_占据)?

我听说一个原因是seq的存在和语义,但是我从未见过完整的解释,为什么它们全部被_|_占据-即为什么它们都不可能被_|_占据tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } 未被占用。

除此之外,还有哪些其他原因?

2 个答案:

答案 0 :(得分:5)

这是懒惰和一般递归的直接结果。在存在惰性的情况下,所有*值可能都是未经评估的表达式。在一般递归的情况下,所有未评估的表达式可能会有所不同。当评估结果有差异时,该值是底部。

*在某些上下文中,您可能已经知道某个值已经被求值,例如来自具有严格字段的​​构造函数上的模式匹配。但是对于每种(提升的)类型,都有一些方法可以生成该类型的未评估值。 undefined :: a是一种这样的方式。

答案 1 :(得分:2)

从某种意义上说,Ctrl + Alt + Click并不适合所有类型。例如,给定:

_|_

此类型的最小元素为newtype Foo = Foo Int 。这很重要,因为Foo _|_上的模式匹配永远不会失败,即使对于Foo也是如此。这仍然是该类型的最少元素,实际上所有Haskell类型都必须具有最少元素。原因是即使标准库中没有undefinedundefined,您仍然需要error的值,这是一个非常基础的语言构建的术语构造,并且存在于所有类型中。