function - 表达式与函数之间的差异

标签 function functional-programming expression

表达式和函数之间的形式区别是什么?我通过观察知道其中的区别,但我正在寻找对它的透彻理解。例如,显示一些来自 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. 一个函数可以有一个作用域/封装并包含多个语句。

最佳答案

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

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

lambda x: x + 1

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

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

关于function - 表达式与函数之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668612/

相关文章:

swift - 函数有返回,返回到哪里?谁拿着它?它能活多久?

haskell - 在函数式响应式(Reactive)编程中,如何在应用程序的两个部分之间共享状态?

typescript - 如何在 TypeScript 中手动柯里化(Currying)一个函数?

java - cup 解析器允许我在语法 LALR 中进行空转换吗?

regex - 反转正则表达式

javascript - 从 Javascript 中的嵌套函数返回值

javascript - 在函数调用时加载外部 Javascript

c# - 正则表达式 - 从 "[A]16 and 5th and A[20] and 15"得到 [A]16, 5, A[20], 15

来自其他类的 C++ 成员函数指针

c# - 在.NET中从OOP思维转变为纯面向函数的编程思维有多难?