球拍二名单lambda

时间:2018-11-07 14:49:56

标签: list racket

我尝试用Racket博士中的“ lambda”做我的第一步。 (高级语言)

一切都很好,直到我尝试了以下代码:

(map (lambda (list1 list2)
     [map list (foldr + 0 (map * list1 list2 ) ) ]    )
   (list 1 2 3 4 5)
   (list 6 7 8 9 10) 
)

我试图尽可能根据Racket文档调整我的代码。 但是我只是不明白这里出了什么问题。 http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/private/map..rkt)._map))

它应该输出一个包含两个具有相同索引的输入列表元素的行列的列表。 控制台输出显示:

map: 2nd argument must be a list, given 1

而1始终是list1的第一个元素

潜意识说我只是在任何地方弄乱()。

1 个答案:

答案 0 :(得分:3)

您似乎误解了lambda的参数在map中的含义。 lambda的参数不是列表,而是列表的元素。

在正常的一元参数映射中,不是:

(map (lambda (list1)
       ....)
     (list 1 2 3 4 5))

但实际上:

(map (lambda (elem1)  ; elem1 is an element of the list
       ....)
     (list 1 2 3 4 5))

两个参数的映射相同。 lambda的参数是它们各自列表中的 elements

(map (lambda (elem1 elem2)  ; elem1 is an element of the first list, elem2 is an element of the second list
       ....)
     (list 1 2 3 4 5)
     (list 6 7 8 9 10))

在您的示例中,两个列表为[Listof Number],因此lambda的参数为Number

(map (lambda (elem1 elem2) ; elem1 : Number, elem2 : Number
       ; here you have two numbers, so you can multiply them,
       ; but `map`-ing over the numbers doesn't make sense
       (* elem1 elem2))
     (list 1 2 3 4 5)   ; [Listof Number]
     (list 6 7 8 9 10)) ; [Listof Number]