表达式与函数之间的差异

Differences between Expression vs Function

表达式和函数在形式上有什么区别?我通过观察知道其中的区别,但我正在寻找对它的透彻理解。例如,显示一些来自 Scheme 或 Python:

的示例
; scheme
(display "hello")                          # expression
((lambda () (display "hello")))            # unnamed lambda
(define hi (lambda () (display "hello")))  # named lambda

# python
>>> print ('hello')          
>>> lambda: print ('hello')
>>> hi = lambda: print ('hello')

在我的初步思考中,我认为不同之处在于:

  1. 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)
  2. 函数可以带参数(表达式可以吗?)
  3. 一个函数可以有一个 scope/encapsulation 并包含多个语句。

您可能在这里将苹果与橙子进行比较。 表达式是一种句法形式。它是代码的一部分,描述了代码是如何解析的。 a + bprint(x) 是表达式,abx 也是表达式。表达式通常由更小的表达式组成,通常有几层深。

另一方面,

A 函数 关注的是语义,而不是句法。这是一个运行时值。有人可能会说

lambda x: x + 1

一个函数。为了完全正确,我会说这些字母被解析为一个表达式,当 被 Python 解释器计算 时,它会产生一个函数。但这太啰嗦了,所以我们通常会跳过中间人,只说 lambda 一个函数。

将表达式赋值给变量是没有意义的。如果我写 x = 1 + 1,我不会将 表达式 1 + 1 分配给变量。我将计算一加一的结果分配给该变量。另一方面,如果我写 x = lambda: 2,那么我实际上是将 函数 分配给变量 x。函数存在于运行时;表达式纯粹是一个解析结构。

如果你在纯 FP 的上下文中考虑它,它不允许副作用(因此不需要语句),那么函数只是一个具有特定类型的值(A -> B).表达式是一些符号的组合,可以减少到一个值。

考虑以下示例:

a = 1 + (2 * 3);
b = a * 10;

add1 = x -> x + 1;

applyTwice = f -> x -> f(f(x))

add2 = applyTwice(add1)

a、b、add1、applyTwice 和 add2 都是已定义的名称,用于保存由特定表达式计算的值。前两个表达式分别减少为7和70,后三个为函数值。最后一个,add2,是通过一个表达式定义的,该表达式减少为一个函数值。

关于您提出的观点:

  • 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)

大多数语言都允许您为名称分配任何表达式。

  • 函数可以带参数(表达式可以吗?)

与非函数不同,函数有参数。如上所述,表达式可以简化为函数值。

  • 一个函数可以有一个 scope/encapsulation 并包含多个语句。

函数体本质上只是一个表达式,尽管它包含引用函数参数的未绑定变量。语句会让人分心 - 某些语言还允许您将一系列语句的结果分配给非函数变量,例如:

result = {
    a = f();
    b = g(a);
    h(b);
}

(即 h(b) 的 return 值赋给结果)

首先回答您的问题:

  1. 一个函数有一个名字并且可以被引用(虽然一个表达式
    可以分配给一个变量?) --- 是的,可以将表达式分配给变量,但与函数不同,您不能使用参数调用表达式。
  2. 函数可以带参数(表达式可以吗?) --- 不,表达式不能带参数。
  3. 一个函数可以有一个 scope/encapsulation 并包含多个语句。 -- 正确

函数式编程 (FP) 都是关于表达式的,因为在 FP 中一切都归结为表达式。 函数在 FP 中用作对象。也就是说,它们通常以与其他变量几乎相同的方式在程序中传递。 例如 - Python 提供了几个函数,可以使用函数式方法进行编程,例如函数 map(aFunction, aSequence)

此函数应用一个 Python 函数,aFunction 到 aSequence 的每个成员。表达式:

L = map(eggs, spam)
print L

在 L 中返回一个新列表(在本例中与垃圾邮件相同)。