Haskell中的纯函数是否有可能改变变量的局部副本,就像Functional Programming Is A Scam! by David Nolen中提到的clojure一样?如果不是这样的原因是什么,如果有的话,有没有人能指出我的例子?
在Functions that look pure to callers but internally use mutation中提出了类似的问题,并且普遍的共识似乎是纯函数执行变异是可行的,只要突变是在变量的局部副本上执行的(即变异不会逃避功能并具有非局部效应。)
当我在沉(Local mutation, global mutation, mutable datastructures,Bubblesort in Qi)中翻译冒泡排序时出现了问题,这个冒号不将列表变异,变为普通的lisp并与bubblesort进行比较在Bubblesort in Common Lisp中,确实改变列表。结果是我发现(在Common Lisp中)对于非常大的列表而言,变异列表的版本比没有变异列表的版本明显更快。
答案 0 :(得分:11)
ST
monad正是为了在纯代码中安全嵌入可变操作。利用类型系统来确保没有任何变异数据可以逃避范围,因此您可以获得本地可变状态的强大功能,而不会使整个程序处于有状态(这可能会破坏引用透明度或引入竞争条件)。
关于ST monad的一些文档:
vsort
的函数。