方案中的 Map + lambda 表达式
Map + lambda expression in scheme
我想我(几乎)了解 map 在 Scheme 中的工作原理,但我无法理解这段代码的工作原理:
(map (lambda (x y z) (y x z))
(list 1 2 3 4) (list + - * /) (list 5 6 7 8))
这个程序内部到底发生了什么?
我们有一个 map
接收多个列表(在本例中为三个)和一个处理它们的过程,一次从每个列表中取出一个元素:
(map (lambda (x y z) (y x z))
(list 1 2 3 4)
(list + - * /)
(list 5 6 7 8))
理解这一点的关键是 lambda
的主体中发生的事情,它按顺序从每个列表中传递一个元素,然后执行此操作:
(y x z)
换句话说:我们从第二个列表中取出一个元素(这是一个过程)并将其应用于第一个和第三个列表中的元素。例如,对于前三个元素,我们将有:
(+ 1 5)
对于第二个元素:
(- 2 6)
等等。如您所知,map
将构建一个新列表,其结果是按元素将过程应用于所有输入列表。在此示例中,结果将是:
'(6 -4 21 1/2)
与以下相同:
(list (+ 1 5) (- 2 6) (* 3 7) (/ 4 8))
我想我(几乎)了解 map 在 Scheme 中的工作原理,但我无法理解这段代码的工作原理:
(map (lambda (x y z) (y x z))
(list 1 2 3 4) (list + - * /) (list 5 6 7 8))
这个程序内部到底发生了什么?
我们有一个 map
接收多个列表(在本例中为三个)和一个处理它们的过程,一次从每个列表中取出一个元素:
(map (lambda (x y z) (y x z))
(list 1 2 3 4)
(list + - * /)
(list 5 6 7 8))
理解这一点的关键是 lambda
的主体中发生的事情,它按顺序从每个列表中传递一个元素,然后执行此操作:
(y x z)
换句话说:我们从第二个列表中取出一个元素(这是一个过程)并将其应用于第一个和第三个列表中的元素。例如,对于前三个元素,我们将有:
(+ 1 5)
对于第二个元素:
(- 2 6)
等等。如您所知,map
将构建一个新列表,其结果是按元素将过程应用于所有输入列表。在此示例中,结果将是:
'(6 -4 21 1/2)
与以下相同:
(list (+ 1 5) (- 2 6) (* 3 7) (/ 4 8))