Matrix 使用lisp的矩阵中的行和

Matrix 使用lisp的矩阵中的行和,matrix,sum,lisp,row,apply,Matrix,Sum,Lisp,Row,Apply,我正在使用函数mapcar和apply做一些LISP练习。我在处理矩阵,我必须对它的行和列求和。我的专栏有: (apply #'mapcar #'+ matrix) 这很有效。因为我知道如何转置矩阵,所以我可以对行做完全相同的事情,对吗?对,那就是: (apply #'mapcar #'+ (apply #'mapcar #'list matrix)) 但是我对这件事不满意。我想直接对行求和,所以我做了一个apply的mapcar: (mapcar #'apply #'+ matrix)

我正在使用函数
mapcar
apply
做一些LISP练习。我在处理矩阵,我必须对它的行和列求和。我的专栏有:

(apply #'mapcar #'+ matrix)
这很有效。因为我知道如何转置矩阵,所以我可以对行做完全相同的事情,对吗?对,那就是:

(apply #'mapcar #'+ (apply #'mapcar #'list matrix))
但是我对这件事不满意。我想直接对行求和,所以我做了一个
apply
mapcar

(mapcar #'apply #'+ matrix)
那不起作用,我不知道为什么。错误是

值#(函数+)不是列表类型。 [类型错误的条件]

对我来说,这将得到矩阵中的每个列表,并在每个列表中应用总和。我无法制作
apply
mapcar
?若否,原因为何?是否有其他方法仅使用
mapcar
apply
对矩阵行求和

PS:我正在使用lispstick进行编译,矩阵是一个列表列表。范例

((1 1 1) (2 2 2) (3 3 3))
对于3x3矩阵。

您的错误 您得到的错误是,它希望在第一个参数之后列出参数,然后查找函数

解决方案 您需要的是to
+
的部分应用程序,即

(defparameter matrix '((1 1 1) (2 2 2) (3 3 3)))
(mapcar (lambda (l) (apply #'+ l)) matrix)
==> (3 6 9)
您甚至可以为此定义一个函数:

(defun partial-application (f &rest some-args)
  (lambda (&rest more-args)
    (apply f (append some-args more-args))))
(funcall (partial-application #'+ 4) 5)
==> 9
(funcall (partial-application #'+ 1 2) 3 4 5)
==> 15
现在,您可以使用它而不是:

笔记:
  • (lambda(l)(apply#'+l))
    (partial application#'apply#'+)
    仅计算列表的总和,并且可以按照所讨论的多种不同方式进行定义

  • 不能安全地替换为不一致的verson,因为
    某些参数

  • rest参数的值允许(但不是必需)与
    apply
    的最后一个参数共享结构


    我觉得有人可能会做出类似于
    (defun applyfun(fn)(lambda(lst)(apply fn lst))
    的东西,但我不相信这个名字是对的。@Sylwester:是的,添加了
    部分应用程序
    ,谢谢你的建议。你可以用
    (defun curry(f&rest args)(lambda(&rest more args))将其概括为一个完整的咖喱函数(应用f(附加参数更多参数)))
    (mapcar (partial-application #'apply #'+) matrix)
    ==> (3 6 9)