为什么Haskell有非严格的函数(语义)?

时间:2013-01-10 15:47:54

标签: haskell functional-programming computer-science category-theory

根据denotational semantics in haskell上的这篇文章 所有类型都有底部,函数f:A-> B是严格如果它将类型A的底部映射到类型B的底部,它被称为非严格其他方面。

(这让人联想到一个指向类别,其中态射保留了基点)。

为什么Haskell有非严格的函数,而标准ML没有?

4 个答案:

答案 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中的懒惰是一种设计选择,可能反映了这样一种信念,即创建一个默认处理惰性的编译器可以提高对功能编程的理解,使研究社区向前迈进一步。