【问题标题】:Is it possible for pure functions in Haskell to mutate local copies of variables?Haskell 中的纯函数是否可以改变变量的本地副本?
【发布时间】:2013-10-21 03:33:22
【问题描述】:

Haskell 中的纯函数是否可以像 David Nolen 在 Functional Programming Is A Scam! 中提到的那样,改变变量的本地副本?如果不是,这是什么原因,如果是的话,有没有人可以指出我的例子?

Functions that look pure to callers but internally use mutation 中提出了一个类似的问题,并且普遍的共识似乎是纯函数执行突变是可以的,只要突变是在变量的本地副本上执行的(即突变的效果确实不转义函数并具有非局部效果)。

当我将 Shen (Local mutation, global mutation, mutable datastructures, Bubblesort in Qi) 中的冒泡排序(Local mutation, global mutation, mutable datastructures, Bubblesort in Qi) 翻译为 common lisp 并与 Bubblesort in Common Lisp 中的冒泡排序进行比较时,问题出现了,它确实改变了列表。结果是我发现(在 Common Lisp 中)改变列表的版本比没有改变列表的版本快得多,对于非常大的列表。

【问题讨论】:

    标签: haskell immutability purely-functional


    【解决方案1】:

    ST monad 正是用于在纯代码中安全嵌入可变操作。类型系统被利用来确保没有任何变异数据可以逃脱范围,因此您可以获得本地可变状态的力量,而不会有使整个程序有状态的危险(这可能会破坏引用透明度或引入竞争条件)。

    一些关于 ST monad 的文档:

    【讨论】:

    • 谢谢。 “Haskell Wiki”中的 sumST 示例非常清楚地说明了纯函数如何使用局部突变。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多