3

我发现 Haskell 令人着迷的一件事是函数和变量是如何相同的。在大多数语言中,变量保存一个值,而函数执行某些操作,然后最终返回一个值。在 Haskell 中,您看不到这种差异,并且在使用 Haskell 之后,回到更“传统”的编程方式,其中变量与函数或方法不同,感觉很尴尬。如果我想得到一个值,我真的不应该担心它的来源,无论是常量值、可变变量还是复杂计算的结果!在 Haskell 中,变量只是 0 元函数

许多面向对象的语言都有一些让人感觉有点差距的属性。

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

4

3 回答 3

4

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

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

  • Haskell(显然),
  • 干净的,
  • 二郎,
  • 毫升。

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

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

于 2011-04-13T20:25:03.877 回答
1

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

为了澄清最后一点,Java 原始数组不是函数。我可能希望将其视为 Clojure 序列,我可以创建一个包装器类型,允许我在原始数组上呈现该接口 (ISeq)。我也可以让包装器类型实现 IFn,然后原始数组也可以被视为一个函数。

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

(nth x 0) ; idiomatic random access
(x 0)     ; used as a function
于 2011-04-13T21:17:33.193 回答
-6

不要忘记Javascript。

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

是完全合法的。

于 2011-04-14T05:08:28.983 回答