2013-10-13 27 views
5

Haskell中的纯函数是否可以像在Functional Programming Is A Scam! by David Nolen中提到的那样通过clojure的方式来变异局部变量副本?如果不是这个原因是什么,如果有的话,是否有任何人可以指点我的例子?Haskell中的纯函数可能会变异变量的本地副本吗?

Functions that look pure to callers but internally use mutation中提出了一个类似的问题,一般认为似乎是纯功能进行突变是可以的,只要突变是在变量的局部拷贝上进行的(即突变的影响不逃避功能并产生非本地效应)。

的问题出现了,当我在翻译沉(Local mutation, global mutation, mutable datastructuresBubblesort in Qi),它确实不变异列表中,以共同口齿不清和比较,在冒泡Bubblesort in Common Lisp,其中变异列表中的冒泡排序。结果是,我发现(在Common Lisp中)对于非常大的列表来说,突变列表的版本要比没有突变列表的版本快得多。

回答

11

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

在ST单子有些文档:

+0

谢谢。 Haskell Wiki中的sumST例子很清楚纯函数如何使用局部变异。 – artella