如何对Clojure中某些结构的多个向量求和

如何对Clojure中某些结构的多个向量求和,clojure,Clojure,更简单的版本: 这项工作: user=> (map + [1 2 3] [4 5 6] [7 8 9]) (12 15 18) 这并不是: user=> (for [n (range 3)] [n (+ 1 n)]) ([0 1] [1 2] [2 3]) user=> (map + (for [n (range 3)] [n (+ 1 n)])) java.lang.ClassCastException 为什么? 我对clojure很陌生,所以这可能是一个新手的错误。在

更简单的版本:

这项工作:

user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
这并不是:

user=> (for [n (range 3)] [n (+ 1 n)])
([0 1] [1 2] [2 3])
user=> (map + (for [n (range 3)] [n (+ 1 n)]))
java.lang.ClassCastException
为什么?


我对clojure很陌生,所以这可能是一个新手的错误。在下面的代码中,我尝试将多个信号添加到一起。每个信号都包含一个向量(称为数据),我想进行分段加法。在REPL,类似这样的内容:

user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
我的代码如下所示:

(defrecord signal [x y data])
(defrecord sampling [t0 dt n])

(defn random-signal [x y sampling tstart tend]
  (let [t0 (:t0 sampling)
       dt (:dt sampling)
       n (:n sampling)
       random-or-zero (fn [i]
                        (let [t (+ t0 (* dt i))]
                          (if (and (>= t tstart) (< t tend)) (- (* 2 (rand)) 1) 0)))
       data (vec (for [i (range n)] (random-or-zero i)))]
    (signal. x y data)))

(defn add-signals [signals]
  (let [s0 (nth signals 0)]
    (signal. (:x s0) (:y s0) (vec (map + (for [s signals] (:data s)))))))

(let [s (sampling. 0 0.1 10)
     r1 (random-signal 5 6 s 0.3 0.5)
     r2 (random-signal 5 6 s 0 1)]
  (prn r1)
  (prn r2)
  (prn (add-signals [r1 r2])))
我做错了什么?

这行不通

(map + (for [n (range 3)] [n (+ 1 n)]))
因为现在您正在传递map,seq of seqs(一个seq而不是第一个示例中的3)

这等于,

 (map + [[1 2 3] [4 5 6] [7 8 9]])
如果你这样做

(apply map + (for [n (range 3)] [n (+ 1 n)]))
它将评估

(map + [0 1] [1 2] [2 3])

原来我需要使用
apply
来处理
for
的版本。是的,我知道,谢谢。我自己发布了答案,但被删除了。
(map + [0 1] [1 2] [2 3])