严格的函数(语义)?
根据这篇关于haskell中的指称语义的文章,所有类型都有底部,并且函数f:A-> B将A类底部映射到B类底部时是严格的,因此它被称为非严格。
(这让人联想到态射保持基点的尖端类别)。
为什么Haskell具有非严格的功能,而标准ML没有?
每种递归编程语言都至少有一个非严格函数,通常以条件形式( if-then-else
)形式存在。 否则,所有的递归都会表示底部(非终止)。 尽管非严格功能是必不可少的,但是,大多数这些语言不允许你自己定义! 有些语言通过提供宏来弥补这一限制 - 这是一种类似于函数的机制,它转换语法而不是值。
为什么Haskell具有非严格的功能,而标准ML没有?
Haskell具有非严格的功能 - 通常是懒惰的 - 因为它们是有用的编程功能。
它们改进了等式推理,使编写代码变得更加容易,并且使编写更多类型的程序成为可能。
Simon Peyton-Jones在他的幻灯片“穿着发衬衫”中给出了一些很好的回应。
懒惰很方便
递归值非常有用
懒惰让你诚实[关于纯度]
最后的原因对我来说最重要。 哈斯克尔的计算纯度和对效果的严格控制在很大程度上归功于其非严格性。
每一种按价值计算的语言都会带来副作用的警报
程序员希望编写类似C的代码,我认为这是大多数语言引用的“警笛声”。 在Haskell中,交错效应无处不在,因为非严格意味着你不能确定何时执行效果。
链接地址: http://www.djcxy.com/p/7501.html上一篇: strict functions (semantics)?
下一篇: What's the difference between undefined in Haskell and null in Java?