【发布时间】:2011-10-27 19:08:11
【问题描述】:
纯函数式编程语言不允许可变数据,但某些计算以命令式方式更自然/直观地表达——或者算法的命令式版本可能更有效。我知道大多数函数式语言都不是纯粹的,它们允许您分配/重新分配变量并执行命令式的事情,但通常不鼓励这样做。
我的问题是,为什么不允许在局部变量中操作局部状态,而是要求函数只能访问它们自己的局部变量和全局常量(或者只是在外部范围中定义的常量)?这样,所有函数都保持引用透明性(它们总是在给定相同参数的情况下给出相同的返回值),但在函数内,计算可以用命令式术语表示(例如,while 循环)。
IO 等仍然可以通过正常的功能方式完成 - 通过 monad 或传递“世界”或“宇宙”令牌。
【问题讨论】:
-
考虑查看现有语言,包括 SML 和 Clojure。
-
你所说的“本地状态”让我想起了 Haskell 的 ST monad。另外值得注意的是清洁或线性类型的 ATS 的唯一性类型,它们还允许您以对程序强加刚性结构为代价来获得内存和其他资源的可变性和安全回收。 Clean 的唯一性类型保留了引用透明度。
-
+1 好问题。正如您所说,大多数函数式语言都是不纯的。我反对你关于不鼓励杂质的断言(例如,哈希表在 OCaml 和 F# 中都很常见),但 API 往往是纯粹的函数式。将突变限制为本地人的问题在于它与您想要的完全相反。可变局部变量实际上用途有限,但可变堆分配集合非常有用,主要是因为它们比纯粹的功能等价物快得多。这就是 HLVM 禁止可变局部变量但允许可变数组的原因。
标签: functional-programming state purely-functional imperative