默认情况下使用不可变变量的语言,如Haskell

时间:2011-04-13 20:22:09

标签: haskell functional-programming referential-transparency

我发现Haskell引人入胜的一件事是函数和变量是如何相同的。在大多数语言中,变量在函数执行某事时保存值,然后最终返回值。在Haskell中你没有看到这种差异,在使用Haskell之后,回归到更多“传统”编程,其中变量与函数或方法不同,感觉很尴尬。如果我想获得一个值,我不应该真正担心它的起源,它是一个常量值,一个可变变量还是一个复杂计算的结果!在Haskell中,变量只是0-ary函数

许多面向对象的语言具有感觉有点差距的属性。

任何人都可以用类似于Haskell的系统表示任何其他语言吗?由于引用透明度,我认为函数式语言很常见,但我看到情况并非如此。例如,在Lisp中,您有(defun)来显式声明函数。

3 个答案:

答案 0 :(得分:4)

  

任何人都可以用类似于Haskell的系统表示任何其他语言吗?

默认情况下,有几种语言有不可变变量(即数学意义上的变量):

  • Haskell(显然),
  • 清洁,
  • 二郎,
  • ML

其他人通过'const'或'val'声明(Scala,C)鼓励这种行为。

在许多函数式语言中,可变值只能通过显式'ref'或'var'声明来引入。

答案 1 :(得分:1)

在Clojure中,defn只是def的一个宏。变量是不可变的,它们具有价值。函数就像任何其他类型的值一样。实际的值是否为函数(Fn)并不重要,因为该类型的值是否实现函数接口(IFn)。

澄清Java基元数组不是函数的最后一点。我可能希望将它视为Clojure序列,我可以创建一个包装器类型,允许我在原始数组上显示该接口(ISeq)。我也可以使用包装器类型实现IFn,然后可以将原始数组视为一个函数。

(def x (wrap-prim-array ...))

(nth x 0) ; idiomatic random access
(x 0)     ; used as a function

答案 2 :(得分:-6)

不要忘记Javascript。

var a = function(x) { return (x + 1) };
var b = a(1);
// b == 2 here.

完全合法。