该解决方案中的 lambda 函数实际上是如何工作的?

How do the lambda functions in this solution actually work?

我正在尝试理解涉及 lambda 函数的问题的解决方案,但我无法只理解其中的一部分。

问题陈述

seven(times(five())) # must return 35
four(plus(nine())) # must return 13
eight(minus(three())) # must return 5
six(divided_by(two())) # must return 3

要求:

  1. 从 0(“零”)到 9(“九”)的每个数字都必须有一个函数
  2. 以下每个数学运算都必须有一个函数:加、减、乘、除(Ruby和Python中的divided_by)
  3. 每次计算只包含一次操作和两个数字
  4. 最外函数代表左操作数,最内函数代表右操作数
  5. 除法应该是整数除法。例如,这应该是 return 2,而不是 2.666666...:[=​​41=]

解决方案

def zero(f = None): return 0 if not f else f(0)
def one(f = None): return 1 if not f else f(1)
def two(f = None): return 2 if not f else f(2)
def three(f = None): return 3 if not f else f(3)
def four(f = None): return 4 if not f else f(4)
def five(f = None): return 5 if not f else f(5)
def six(f = None): return 6 if not f else f(6)
def seven(f = None): return 7 if not f else f(7)
def eight(f = None): return 8 if not f else f(8)
def nine(f = None): return 9 if not f else f(9)

def plus(y): return lambda x: x+y
def minus(y): return lambda x: x-y
def times(y): return lambda  x: x*y
def divided_by(y): return lambda  x: x/y

我的问题

def plus(y): return lambda x: x+y中,两个参数是如何传递给这个函数的?我知道它与“闭包”有关,但我无法在 this 上下文中找到任何帮助我理解它的文档。

例如:three(plus(one())) 扩展为 return 3 if not plus() else plus(3)

然后,plus(3) 扩展为 return lambda x: x + 3x 从哪里得到它的值?

In def plus(y): return lambda x: x+y, how are both arguments passed to this function?

它没有——或者至少,plus()没有将两个参数都传递给 lambda 函数。 plus(3) returns lambda x: x + 3 -- 接受一个参数并将其参数递增 3 的函数。此过程称为 currying.

为了解决您的示例,three(plus(one()))

  • one() returns 1.
  • plus(one()) 变为 plus(1) 和 returns lambda x: x + 1.
  • three(plus(one()) 变为 three(lambda x: x + 1)three() 调用传入的 lambda 函数,参数为 3,returns 结果值。这给出了最终结果 4.