默认情况下具有不可变变量的语言,如Haskell

默认情况下具有不可变变量的语言,如Haskell,haskell,functional-programming,referential-transparency,Haskell,Functional Programming,Referential Transparency,我发现Haskell有一点很吸引人,那就是函数和变量是如何相同的。在大多数语言中,当函数执行某些操作时,变量会保存一个值,然后最终返回一个值。在Haskell中,您看不到这种差异,在使用Haskell之后,退回到更“传统”的编程中,在那里变量与函数或方法不同,感觉很尴尬。如果我想得到一个值,我不应该真的担心它的起源,不管它是一个常量值、一个可变变量还是一个复杂计算的结果!在Haskell中,变量只是0元函数 许多面向对象语言的属性感觉有点差距 有人能指出其他语言有类似Haskell的系统吗?我认

我发现Haskell有一点很吸引人,那就是函数和变量是如何相同的。在大多数语言中,当函数执行某些操作时,变量会保存一个值,然后最终返回一个值。在Haskell中,您看不到这种差异,在使用Haskell之后,退回到更“传统”的编程中,在那里变量与函数或方法不同,感觉很尴尬。如果我想得到一个值,我不应该真的担心它的起源,不管它是一个常量值、一个可变变量还是一个复杂计算的结果!在Haskell中,变量只是0元函数

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

有人能指出其他语言有类似Haskell的系统吗?我认为这对于函数式语言来说是很常见的,因为引用的透明性,但事实并非如此。例如,在Lisp中,可以使用
(defun)
显式声明函数

有人能指出其他语言有类似Haskell的系统吗

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

  • 哈斯克尔(显然)
  • 干净,
  • 二郎
  • 毫升
其他人通过“const”或“val”声明(Scala,C)鼓励这种行为


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

在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

别忘了Javascript

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

是完全合法的。

在Haskell中,
fx=x
f=\x->x
相同,因此
=`在某种程度上与
defun`相同。在Haskell中,函数和变量是一样的,但它们也不一样。我想说函数只是值,但还有其他东西也是值。该死,在Haskell中,函数和变量不一样。(请阅读Conal Elliot的帖子,)“函数”是一个语义概念,“变量”是一个句法概念。正如luqui所说,函数值和非函数值都是值(不是变量)。有些变量是函数类型的,有些变量不是函数类型的。乔纳森:谢谢你的插件。我的姓有两个“t”。这不是我的反对票,但Javascript变量在默认情况下并不是一成不变的,这是问题的主旨。我很确定这个问题被编辑得太频繁了,所以这个答案不再合适。我同意对新问题的否决票,但我很确定我回答了一个完全不同的问题。是的,仔细阅读编辑显示了对这个问题标题的以下非常实质性的编辑。这个问题的标题曾经是“函数和变量的相等性,比如Haskell”,我认为这是一个关于第一类函数的问题。顺便说一句,我对JavaScript有一种爱恨关系,但对Haskell却有一种纯粹的爱恨关系。它仍然是我最喜欢的编程语言。