球拍两个列表 lambda

Aki*_*Aki 3 list racket

我尝试在 Dr 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) 
)
Run Code Online (Sandbox Code Playgroud)

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

它应该输出一个由具有相同索引的 2 个输入列表元素的积组成的单个列表。控制台输出显示:

map: 2nd argument must be a list, given 1
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*uth 5

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

在正常的单参数映射中,它不是:

(map (lambda (list1)
       ....)
     (list 1 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)

但实际上:

(map (lambda (elem1)  ; elem1 is an element of the list
       ....)
     (list 1 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)

这与二元映射相同。lambda 的参数是其各自列表的元素:

(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))
Run Code Online (Sandbox Code Playgroud)

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

(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]
Run Code Online (Sandbox Code Playgroud)