主要问题:我们应该如何使用地图来处理列表列表?换句话说,假设我们有一个列表A =(a b c),地图是否可以像(map func a b c)一样处理列表A?
这是此问题的详细说明。
假设有2个矩阵:
(define v
(list (list 1 2 3)
(list 4 5 6)))
(define w
(list (list 3 2 1)
(list 6 5 4)))
要计算v和w的点积,请使用map:
(define (vector-dot . vectors)
(map *
(car vectors)
(cadr vectors)))
(define (matrix-dot v w)
(map vector-dot
v
w))
上面的代码运行良好,但是如果我们将vector-dot函数更改为:
(define (vector-dot . vectors)
(map * vectors))
和(矩阵点v w)将引发错误。
问题不是为什么它会引发错误,而是我们应该如何使用地图来处理列表,就像将该列表的所有元素都当作参数一样?
答案 0 :(得分:3)
您可以使用apply
,它会补充其余参数。
(define (vector-dot . vectors)
(apply map * vectors))
(vector-dot '(1 2 3) '(2 2 2) '(10 11 12))
; ==> (20 44 72)
因此,在此示例中,vectors
是列表的列表,例如'((1 2 3) (2 2 2) (10 11 12))
,而(apply map * '((1 2 3) (2 2 2) (10 11 12)))
与(map * '(1 2 3) '(2 2 2) '(10 11 12))
相同