我尝试在 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 的第一个元素
潜意识说我只是在任何地方搞乱了( )。
您似乎误解了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],因此 的参数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]
Run Code Online (Sandbox Code Playgroud)