为什么每个非原始的haskell数据类型都被提升(即被_|_
占据)?
我听说一个原因是seq
的存在和语义,但是我从未见过完整的解释,为什么它们全部被_|_
占据-即为什么它们都不可能被_|_
占据tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
未被占用。
除此之外,还有哪些其他原因?
答案 0 :(得分:5)
这是懒惰和一般递归的直接结果。在存在惰性的情况下,所有*值可能都是未经评估的表达式。在一般递归的情况下,所有未评估的表达式可能会有所不同。当评估结果有差异时,该值是底部。
*在某些上下文中,您可能已经知道某个值已经被求值,例如来自具有严格字段的构造函数上的模式匹配。但是对于每种(提升的)类型,都有一些方法可以生成该类型的未评估值。 undefined :: a
是一种这样的方式。
答案 1 :(得分:2)
从某种意义上说,Ctrl + Alt + Click
并不适合所有类型。例如,给定:
_|_
此类型的最小元素为newtype Foo = Foo Int
。这很重要,因为Foo _|_
上的模式匹配永远不会失败,即使对于Foo
也是如此。这仍然是该类型的最少元素,实际上所有Haskell类型都必须具有最少元素。原因是即使标准库中没有undefined
和undefined
,您仍然需要error
的值,这是一个非常基础的语言构建的术语构造,并且存在于所有类型中。