4

根据这篇关于haskell中指称语义的文章, 所有类型都有底部,如果函数f:A->B将类型A的底部映射到类型B的底部,则它是严格的,否则称为严格

(这让人联想到态射保留基点的尖锐类别)。

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

4

4 回答 4

12

每种具有递归的编程语言都至少有一个非严格函数,通常以条件 ( if-then-else) 的形式出现。否则,所有递归都将表示底部(非终止)。然而,与非严格函数一样,这些语言中的大多数都不允许您定义自己的函数!一些语言通过提供宏来弥补这一限制——这是一种类似于函数的机​​制,可以转换语法而不是值。

于 2013-01-10T18:00:08.560 回答
7

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

Haskell 有非严格的函数——通常是惰性函数——因为它们是一个有用的编程特性。

它们改进了等式推理,使编写代码更容易,并使编写更多种类的程序成为可能。

于 2013-01-10T16:31:23.667 回答
6

Simon Peyton-Jones 在他的一组幻灯片《穿毛衬衫》中对此给出了很好的回应。

懒惰很方便

递归值非常有用

懒惰让你诚实[关于纯洁]

最后一个原因对我来说是最重要的。Haskell 的计算纯度和对效果的严格控制在很大程度上归功于它的非严格性。

每种按值调用的语言都已屈服于副作用的警笛声

程序员想要编写类似 C 的代码,我认为这是在大多数语言中引诱的“警笛声”。在 Haskell 中,随意交错效果是没有意义的,因为非严格性意味着您无法确定何时执行效果。

于 2013-01-10T18:16:24.797 回答
1

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

因为,haskell 中的表达式以弱头范式计算,而标准 ML 表达式以范式计算。

然后,在 Haskell 中,您可以在标准 ML 中使用未评估的 thunk 进行推理,而这是您无法做到的。
但是,您应该知道可以将惰性添加到标准 ML。(例如,您可以在 ocaml 中执行此操作)

Haskell 中默认的惰性是一种设计选择,可能反映了这样一种信念,即创建一个默认处理惰性的编译器可以提高对函数式编程的理解,让研究社区向前迈出一步。

于 2013-01-10T17:06:40.167 回答