在Scheme

时间:2018-07-07 02:56:17

标签: list dictionary matrix scheme

主要问题:我们应该如何使用地图来处理列表列表?换句话说,假设我们有一个列表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)将引发错误。

问题不是为什么它会引发错误,而是我们应该如何使用地图来处理列表,就像将该列表的所有元素都当作参数一样?

1 个答案:

答案 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))相同