Racket两个列表的lambda函数

3

我尝试在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) 
)

我尽力根据 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个回答

5

你似乎误解了在maplambda的参数意义。 lambda的参数不是列表,而是列表中的元素。

在普通的单参数map中,它并不是这样的:

(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))

对于带有两个参数的map函数同样如此。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))

在你的例子中,这两个列表是[数字列表],所以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]

好的,我明白了。有没有办法在lambda内部获取列表,还是我需要为此定义一个函数? - Aki
1
@Aki 如果你不需要 map,那么外部的 lambda 也就没有必要了。你可以直接使用列表,或者编写一个接受两个列表的过程,并将其与代码中的 list 表达式一起传递,以获得你想要的结果。 - Sylwester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接