函数和数据有什么区别?

What is the difference between functions and data?

在函数式编程中,我们倾向于区分数据和函数,到底有什么区别呢?

如果我考虑一个常量,我可以将其视为一个函数,它只是 returns 相同的值:

(def x 5)

那么数据和函数有什么区别呢?我没看出区别。

数据

  • 数据一个值(具有特定类型)。

    • 例如,5Integer类型的值,"abc"String类型的值。 [5 "abc"] 等复合值的类型为 Vector.

    • 两个相同类型的数据值总是可以比较相等.

  • 数据永远不会执行。也就是说,控制线程(又名程序计数器或 PC)永远不会进入数据结构。

函数(又名“代码”)

  • 函数的唯一类型是“代码”。

    • 两个函数 永远不会相等,即使它们是彼此重复的。
  • 一个函数产生一个值(具有特定类型)当它是执行(可能带有参数)。

    • 执行是指控制线程进入代码数据结构。那里遇到的代码和数据值可以完全控制发生的任何副作用,以及 return 值。

    • 编译和解释代码产生相同的结果。它们之间的唯一区别是权衡复杂性和速度的实现细节。

评估

  • (eval ...) 特殊形式接受 数据作为输入 和 return 一个 函数输出。 returned 函数可以执行(即调用),因此控制线程进入函数。

    • 为清楚起见,上面省略了 reader 等细节

    • 最好被视为编译器扩展嵌入代码中,不影响数据与代码的区分。


后记

我突然想到原来的问题还没有完全回答。考虑以下因素:

; A Clojure Var pointing to the value 5
(def five 5)

; A Clojure Var pointing to a function that always returns the value 5
(def ->five  (fn [& args] 5))

然后使用这两个变量:

five      => 5
(->five)  => 5

括号让一切变得不同。

另请参阅:

在具有 属性 同音性的语言中,代码就是数据,数据就是代码。 这种代码数据二元性模糊了代码和数据之间的区别。 (我认为你的问题是关于 lambda 和数据之间的区别是什么 - 如果 lambda 本身实际上也只是一个必须执行的数据结构......)

在谐音语言中,数据可以变成 lambda(如果它包含 lambda 的指令),反之亦然。

也许,区别仅在于它们的类型(函数与任何其他数据结构或原始数据类型)。