Clojure ClassCastException long to IFn

Clojure ClassCastException long to IFn,clojure,Clojure,我是clojure的新手,我正在尝试制作一个用复数进行数学运算的小程序。我尝试过多个版本的乘法函数,它们都给出了相同的错误。对于其他一些函数,使用let修复了它,但这里没有。immake只返回一个包含实数和虚数的向量 (defn im-mult ([i j] (let [a (first i) b (second i) x (first j) y (second j)] (im-make (- (* (a) (b)) (

我是clojure的新手,我正在尝试制作一个用复数进行数学运算的小程序。我尝试过多个版本的乘法函数,它们都给出了相同的错误。对于其他一些函数,使用let修复了它,但这里没有。immake只返回一个包含实数和虚数的向量

(defn im-mult
  ([i j]
    (let [a (first i)
          b (second i)
          x (first j)
          y (second j)]
  (im-make (- (* (a) (b)) (* (x) (y)))
             (+ (* (a) (b)) (* (x) (y)))))))
给定两个具有实数和虚数的向量,=>(im mult x y)

ClassCastException java.lang.Long无法强制转换为clojure.lang.IFn ComplexMath.core/im-mult(无源文件:7)


我只想说,哇!我不认为clojure在这里有这么多支持,谢谢你的建议,错误当然是括号和不正确的乘法

不需要围绕
a
b
x
y
的括号。此外,他们让Clojure尝试将数字解释为函数。这应该可以解决这个问题:

(defn im-mult
  ([i j]
    (let [a (first i)
          b (second i)
          x (first j)
          y (second j)]
      (im-make (- (* a b) (* x y))
           (+ (* a b) (* x y))))))
1) 你需要去掉a、b、x和y周围的多余部分

2) 每当你看到一堆第一和第二,这是一个很好的线索,你应该分解你的输入:

(defn im-mult
  [i j]
  (let [[a b] i
        [x y] j]
    (im-make (- (* a b) (* x y))
             (+ (* a b) (* x y)))))
我总是推荐这个而不是1。这可能是一个好地方,停止可读性,但对于露齿而笑,我们可以继续推动它

3) 我注意到(*a b)和(*x y)被使用了两次,因此实际上根本不需要解构-我们可以将*应用于I和j:

(defn im-mult
  [i j]
  (let [ab (apply * i)
        xy (apply * j)]
    (im-make (- ab xy)
             (+ ab xy))))
4) 我注意到您对两个输入都应用了相同的操作,因此不妨跨输入映射操作

(defn im-mult
  [i j]
  (let [m (map #(apply * %) [i j])]
    (im-make (apply - m)
             (apply + m))))
5) 对-和+的观察结果相同

(defn im-mult
  [i j]
  (let [m (map #(apply * %) [i j])
        s (map #(apply % m) [- +])]
    (apply im-make s)))

在这一点上,很难看出代码的意图。然而,我认为其中一个原因是您将输入的数量固定为2。我怀疑这里有一个n维算法,将[&i]作为输入将引导您到一个更美丽的地方,同时也会改进代码

对于虚数
z1=(a+bi)
z2=(c+di)
,它们的乘积是
z1*z2=(ac-bd)+(ad+bc)i
。所以,如果(im mult z1 z2)=z1*z2,那么
(defn im mult[[ab][cd][((((((*ac)(*bd))),(+(*ad)(*bc)))
。是的,这段代码一开始计算不正确,从java移植得不好,我没有太注意什么与什么相乘。谢谢非常感谢!我有一套规范,我必须遵循一个类,但我明白你的意思,关于地图的使用。回答得好!