柯里化 lambda 表达式如何工作?

How does currying lambda expressions work?

我不知道代码是如何执行的。这是一道练习题。

(lambda x: x(x))(lambda y:4)

输出是4,但我不知道代码是如何运行的。我觉得步骤如下:

  1. lambda (x) 已定义
  2. 执行 lambda (x)
  3. returns x(λ(y))
  4. lambda (y) 已定义
  5. returns 4
  6. x(4)?

我知道第 6 步是错误的。

别想"lambda is defined"。 lambda 是一个值,例如 4。你不 "define" 一个 4 - 它就是这样。评估 lambda 时,只需将其(评估的)参数替换为其主体(在必要时添加括号)。像重写问题一样处理它。

(lambda x: x(x))(lambda y:4)
# rewrite all `x` in `x(x)` to `lambda y:4` (two appearances):
(lambda y:4)(lambda y:4)
# rewrite all `y` in `4` to `lambda y:4` (zero appearances):
4

lambda 表达式就像一个未命名的函数(匿名函数)一样工作。并且像这样工作:

lambda (1): (2)

(1)是参数

(2) return

参见:

def square(x):
    return x**2

使用 lambda 表达式:

square = lambda x: x**2

>>> square(2)
4

但是想一想使用,也许你只是想使用几次功能,为什么要存储它?创建一个匿名函数!如何? 运行使用 lambda 函数:

>>> (lambda x: x**2)(2)
4

看到了吗?没那么难。让我们一起思考。

(lambda x: x(x))(lambda y:4)

lambda y: 4 传递给我们的 lambda x 函数,现在 x = (lambda y: 4)(疯狂的事情!)。 x(x) 等于 (lambda y: 4)((lambda y: 4))。看!我们的第一个参数 'y' 是 (lambda y: 4)!然后执行第一个函数,然后 returns 4. 第二个呢?它不需要运行,也不需要运行!如果你执行 x(x(x)),第二个函数将 运行,但不是第三个函数。

这是一个棘手的问题。

Lambda 是匿名函数。让我们定义它们以帮助您了解正在发生的事情。

# (lambda x: x(x))
def func_1(func):
    return func(func)

# (lambda y: 4)
def func_2(y):
    return 4

>>> func_1(func_2)  # Equivalent to (lambda x: x(x))(lambda y:4)
4

第二个函数只是一个可调用函数,它 return 是常量值 4,与 y 的值无关,因此 func_2(10)func_2(0) 都 return 4.

第一个函数是一个可调用函数,其自身作为函数的单个参数 (x(x))。我们刚刚看到第二个函数是一个可调用函数,无论输入参数如何,它都会 return 常量值 4,所以 func_2(func_2) 只是 returns 4.