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

Moz*_*lah 5 computer-science haskell functional-programming category-theory

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

(这让人联想到一个尖刻的类别,其中态射保留了基点).

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

Con*_*nal 12

每个带递归的编程语言都至少有一个非严格函数,通常采用conditional(if-then-else)的形式.否则,所有递归都表示底部(非终止).然而,作为非严格函数必不可少的是,大多数这些语言都不允许您定义自己的语言!有些语言通过提供宏来弥补这一限制 - 这是一种类似函数的机制,可以转换语法而不是值.


Don*_*art 7

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

Haskell具有非严格的函数 - 通常是懒函数 - 因为它们是一个有用的编程特性.

它们改进了等式推理,使编写代码变得更容易,并且可以编写更多种类的程序.

  • 啊,我明白了.懒惰是实现非严格语义的一种方法. (3认同)

Dan*_*ton 6

Simon Peyton-Jones在他的一套幻灯片" 穿着头发衬衫"中给出了一些很好的回应.

懒惰很方便

递归值非常有用

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

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

每种按值调用的语言都会产生副作用的警报

程序员想要编写类似C的代码,我认为这是在大多数语言中引诱的"警报器".在Haskell中,不受限制的交错效果是没有意义的,因为非严格意味着你不确定何时会执行效果.