方案中的Map + lambda表达式

时间:2015-03-17 16:19:14

标签: lambda scheme r5rs

我认为我(几乎)了解地图在Scheme中的工作方式,但我无法理解此代码的工作原理:

(map (lambda (x y z) (y x z))
   (list 1 2 3 4) (list + - * /) (list 5 6 7 8))

此程序中实际发生了什么?

1 个答案:

答案 0 :(得分:3)

我们有一个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))