Haskell中的纯函数是否可能改变变量的局部副本?

Haskell中的纯函数是否可能改变变量的局部副本?,haskell,immutability,purely-functional,Haskell,Immutability,Purely Functional,Haskell中的纯函数是否可以像David Nolen在中提到的clojure那样改变变量的局部副本?如果没有,原因是什么?如果有的话,有没有人可以给我举个例子 年提出了一个类似的问题,普遍的共识似乎是,纯函数执行突变是可以的,只要突变是在变量的局部副本上执行的(即突变的效应不会逃逸函数,并且具有非局部效应) 当我将Shen(,)中的冒泡排序转换为common lisp并与中的冒泡排序进行比较时,出现了一个问题,中的冒泡排序不改变列表,而中的冒泡排序改变列表。结果是,我发现(在公共Lisp中)

Haskell中的纯函数是否可以像David Nolen在中提到的clojure那样改变变量的局部副本?如果没有,原因是什么?如果有的话,有没有人可以给我举个例子

年提出了一个类似的问题,普遍的共识似乎是,纯函数执行突变是可以的,只要突变是在变量的局部副本上执行的(即突变的效应不会逃逸函数,并且具有非局部效应)


当我将Shen(,)中的冒泡排序转换为common lisp并与中的冒泡排序进行比较时,出现了一个问题,中的冒泡排序不改变列表,而中的冒泡排序改变列表。结果是,我发现(在公共Lisp中)对于非常大的列表,变异列表的版本比未变异列表的版本要快得多。

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

关于圣莫纳德的一些文件:

  • -请参阅名为
    vsort
    的函数

谢谢。“Haskell Wiki”中的sumST示例非常清楚地说明了纯函数如何使用局部突变。