6

Haskell 中的纯函数是否有可能改变变量的本地副本,就像函数式编程是一个骗局中提到的 clojure 一样!,大卫·诺伦?如果不是,这是什么原因,如果是的话,有没有人可以指出我的例子?

在对调用者来说看起来很纯粹但内部使用突变的函数中提出了一个类似的问题,并且普遍的共识似乎是纯函数执行突变是可以的,只要突变是在变量的本地副本上执行的(即效果的突变不会逃避功能并具有非局部影响)。

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

4

1 回答 1

12

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

关于 ST monad 的一些文档:

于 2013-10-13T13:08:17.463 回答