List 用Scheme中的map编写矩阵的点积

List 用Scheme中的map编写矩阵的点积,list,dictionary,matrix,scheme,List,Dictionary,Matrix,Scheme,主要问题:我们应该如何使用地图它可以处理列表列表吗?换句话说,假设我们有一个列表a=(abc),map可以像(map func abc)一样处理列表a吗 下面是对这个问题的详细描述 假设有两个矩阵: (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 .

主要问题:我们应该如何使用地图它可以处理列表列表吗?换句话说,假设我们有一个列表a=(abc),map可以像(map func abc)一样处理列表a吗


下面是对这个问题的详细描述

假设有两个矩阵:

(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))
上面的代码运行良好,但如果我们将函数向量点更改为:

(define (vector-dot . vectors)
  (map * vectors))
和(矩阵点v w)将抛出一个错误


问题不在于它为什么会抛出错误,而在于我们应该如何使用映射。它是否可以像将此列表中的所有元素视为参数一样处理列表?

您可以使用
apply
,这是对rest参数的补充

(define (vector-dot . vectors)
  (apply map * vectors))

(vector-dot '(1 2 3) '(2 2 2) '(10 11 12))
; ==> (20 44 72)

因此,在这个例子中,向量是类似于
((1232)(10112))的列表,而
(apply map*)((1232)(10112))
(apply map*)((1232)(10112))
(map*”(1232);(10112))相同。
您可以使用
apply
,这是对rest参数的补充

(define (vector-dot . vectors)
  (apply map * vectors))

(vector-dot '(1 2 3) '(2 2 2) '(10 11 12))
; ==> (20 44 72)

因此,在这个例子中,向量是类似于
((1232)(10112))的列表和
(apply-map*)((1232)(10212))
(apply-map*)((1232)(10112))
(map*)(1232)“10212”)相同。
你熟悉
应用
吗?