phiên bản đơn giản:Làm thế nào để tổng hợp nhiều vectơ từ một số cấu trúc trong Clojure
này hoạt động:
user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
này không:
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
Tại sao?
Tôi rất mới với clojure vì vậy đây có thể là lỗi mới của người mới. Trong đoạn code dưới đây tôi đang cố gắng để thêm nhiều tín hiệu với nhau. Mỗi tín hiệu có chứa một vector (được gọi là dữ liệu) và tôi muốn làm thêm phần khôn ngoan. Tại REPL, một cái gì đó như thế này:
user=> (map + [1 2 3] [4 5 6] [7 8 9])
(12 15 18)
Mã của tôi trông giống như:
(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])))
Mã ngẫu nhiên tín hiệu hoạt động tốt, nhưng mã thất bại trong "bản đồ +" với một ngoại lệ lớp diễn viên . Vì vậy, đầu ra (vô ích) là:
#:com.xxx.signal{:x 5, :y 6, :data [0 0 0 0.347104804641861 -0.043159177718418595 0 0 0 0 0]}
#:com.xxx.signal{:x 5, :y 6, :data [0.4956475276522727 -0.5843463943909746 -0.3375682325118188 0.5082971115650308 -0.971067613756232 0.6002887290735672 0.06900015064406251 -0.49986294956362287 0.657705242728329 0.7737992261031372]}
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassCastException (fake.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:5440)
at clojure.lang.Compiler.load(Compiler.java:5857)
at clojure.lang.Compiler.loadFile(Compiler.java:5820)
at clojure.main$load_script.invoke(main.clj:221)
at clojure.main$script_opt.invoke(main.clj:273)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.RuntimeException: java.lang.ClassCastException
at clojure.lang.LazySeq.sval(LazySeq.java:47)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.lang.LazilyPersistentVector.create(LazilyPersistentVector.java:31)
at clojure.core$vec.invoke(core.clj:318)
at com.xxx.fake$add_signals.invoke(fake.clj:60)
at com.xxx.fake$eval223.invoke(fake.clj:74)
at clojure.lang.Compiler.eval(Compiler.java:5424)
... 15 more
Caused by: java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2990)
at clojure.core$cast.invoke(core.clj:293)
at clojure.core$_PLUS_.invoke(core.clj:815)
at clojure.core$map$fn__3699.invoke(core.clj:2094)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
... 22 more
Process finished with exit code 1
Tôi đang làm gì sai?
Hóa ra tôi cần sử dụng 'áp dụng' cho phiên bản có' for'. –