haskell - 懒惰和纯洁有什么关系?

标签 haskell functional-programming lazy-evaluation language-implementation

Laziness is what kept Haskell pure. If it had been strict, purity would soon go out the window.


我看不到语言的评估策略与其纯度之间的联系。考虑到推文作者的声誉,我肯定忽略了一些东西。也许有人可以提供一些启示。

最佳答案

你是对的,从现代 POV 来看,这没有任何意义。事实是,默认懒惰会让对副作用代码的推理成为一场噩梦,所以懒惰确实需要纯洁性——但反之则不然。
需要惰性的是 Haskell 在 1.0-1.2 版本中的方式,遵循其前身 Miranda ,模拟没有单子(monad)的 IO。没有任何明确的副作用排序概念,可执行程序的类型是

main :: [Response] -> [Request]
对于一个简单的交互式程序,它会像这样工作:main一开始会忽略它的输入列表。因此,由于懒惰,该列表中的值实际上不需要存在。同时它会产生第一个 Request值,例如终端提示用户输入内容。输入的内容会以 Response 的形式返回。值,现在才真正需要评估,从而产生新的 Request等等等等。
https://www.haskell.org/definition/haskell-report-1.0.ps.gz
在 1.3 版本中,他们切换到了我们今天都知道和喜爱的 monadic-IO 接口(interface),那时懒惰不再是必要的了。但在此之前,普遍的看法是,在没有惰性的情况下与现实世界交互的唯一方法是允许具有副作用的函数,因此声明没有惰性,Haskell 只会走上与之前的 Lisp 和 ML 相同的道路。

关于haskell - 懒惰和纯洁有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63469458/

相关文章:

scala - 将 Scala 类型示例转换为 Haskell

algorithm - 二郎 : Finding multiple Max values of a list

http - 懒惰地消费http请求

haskell - 如何在 Haskell 中强制立即调用函数?

c++ - std::function 方法引用无法将 DWORD 转换为 DWORD64?

AND() 和 OR() 的 Excel 惰性求值

haskell - 如何表达 'takeWhile for vectors' 的类型?

Haskell:单子(monad)的单子(monad)

haskell - 如何创建一个允许 IO 但不是 MonadIO 的 monad?

c++ - C++ 中的高阶函数,使用 std::wcout 失败并出现错误 C2248