【问题标题】:What is the difference between functions and data?函数和数据有什么区别?
【发布时间】:2021-10-24 14:26:29
【问题描述】:

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

如果我考虑一个常量,我可以把它看作一个函数,它只是返回相同的值:

(def x 5)

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

【问题讨论】:

  • 如果你说的是一等纯函数,那么反过来说:没有区别。函数的特殊之处在于它们是不透明的类型。
  • 这方面可能有趣的是SICP's section on Data as Programs:“从用户的角度来看,(* x x) 这样的输入表达式是编程语言中的表达式,求值者应该执行它。从然而,从评估者的角度来看,表达式只是一个列表(在这种情况下,是一个由三个符号组成的列表:*xx),它将根据一组明确定义的规则...... [T]用户的程序是评估者的数据”。
  • Clojure 的特性,即程序是用 Clojure 本身的原始类型的数据结构编写的,称为homoiconicity

标签: functional-programming clojure


【解决方案1】:

数据

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

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

    • 同一类型的两个数据值始终可以比较相等

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

函数(又名“代码”)

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

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

    • 执行意味着控制线程进入代码数据结构。在那里遇到的代码和数据值可以完全控制发生的任何副作用以及返回值。

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

评估

  • (eval ...) 特殊形式接受数据作为输入并返回一个函数作为输出。可以执行(即调用)返回的函数,以便控制线程进入函数。

    • 为清楚起见,以上省略了阅读器等细节。

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


后记

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

; 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

括号决定了一切。

另见:

【讨论】:

  • 如果你将一个键传递给一个不可变的地图数据结构,你可能会得到一个值。这样的映射是某种类型的值。如果将参数传递给函数,则会返回一个值(除非它是偏函数)。函数也是某种类型的值。如果您处于无类型设置中,则此类型只是程序员的约定。您可以使用动态语言的自省方式在运行时确定映射的类型,但不能对函数执行此操作,因为函数是不透明的值。这是主要区别。另一方面,平等并不是价值观所固有的。
  • (1) 将地图视为函数只是调用get 函数的语法糖。 (2) “函数”是一种类型,就像“整数”和“字符串”都是类型一样。 “function”类型的值可以在函数执行时被使用和返回。 (3) 地图的类型总是“地图”。其键和值的类型与作为“地图”的容器无关。
  • 考虑到这个问题被标记为函数式编程,答案是错误的。函数和其他数据类型在 FP 中被视为值。这是函数式编程的核心:一切都有价值,甚至是效果。
  • 函数的唯一类型是“code”。即使放在引号中也没有意义。 “代码”不是类型。
  • 并非每种类型的值都具有相等属性,因此相等性无助于区分函数和值。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2013-01-14
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多