根据denotational semantics in haskell上的这篇文章 所有类型都有底部,函数f:A-> B是严格如果它将类型A的底部映射到类型B的底部,它被称为非严格其他方面。
(这让人联想到一个指向类别,其中态射保留了基点)。
为什么Haskell有非严格的函数,而标准ML没有?
答案 0 :(得分:12)
每个带递归的编程语言至少有一个非严格函数,通常采用条件(if-then-else
)的形式。否则,所有递归都表示底部(非终止)。然而,作为非严格函数必不可少的是,大多数这些语言都不允许您定义自己的语言!有些语言通过提供宏来弥补这一限制 - 这是一种类似函数的机制,可以转换语法而不是值。
答案 1 :(得分:7)
为什么Haskell有非严格的函数,而标准ML没有?
Haskell具有非严格的函数 - 通常是懒函数 - 因为它们是一个有用的编程功能。
他们改进了等式推理,使代码编写更容易,并且可以编写更多种类的程序。
答案 2 :(得分:6)
Simon Peyton-Jones在他的幻灯片Wearing the Hair Shirt中给出了一些很好的回应。
懒惰很方便
递归值非常有用
懒惰让你诚实[关于纯度]
最后一个原因对我来说最重要。 Haskell的计算纯度和对效果的严格控制在很大程度上归因于其非严格性。
每种按值调用的语言都引入了副作用的警笛声
程序员想要编写类似C的代码,我认为这是在大多数语言中引诱的“警笛”。在Haskell中,不受限制的交错效果是没有意义的,因为非严格意味着你不确定何时会执行效果。
答案 3 :(得分:1)
为什么Haskell有非严格的函数,而标准ML没有?
因为,haskell中的表达以弱头正常形式评估,而在Standar ML表达中以正常形式评估。
然后,在Haskell中你可以推理使用标准ML中未评估的thunk你不能 但是,您应该知道懒惰可以添加到标准ML。 (例如,您可以在ocaml中执行此操作)
默认情况下,haskell中的懒惰是一种设计选择,可能反映了这样一种信念,即创建一个默认处理惰性的编译器可以提高对功能编程的理解,使研究社区向前迈进一步。