【问题标题】:Clojure ClassCastException long to IFnClojure ClassCastException 长到 IFn
【发布时间】:2014-03-12 11:09:59
【问题描述】:

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

(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 (NO_SOURCE_FILE:7)

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

【问题讨论】:

  • 对于虚数z1 = (a + bi)z2 = (c + di),它们的乘积是z1 * z2 = (ac-bd)+(ad+bc)i。所以,如果 (im-mult z1 z2) = z1 * z2,那么 (defn im-mult [[a b] [c d]] [(- (* a c) (* b d)), (+ (* a d) (* b c))]).
  • 是的,这段代码起初计算不正确,从 java 移植得不好,我没有太注意什么乘以什么。谢谢!

标签: clojure


【解决方案1】:

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] 作为输入会带您到一个更美丽的地方,同时也会改进代码。

【讨论】:

  • 非常感谢!我有一套课程必须遵循的规范,但我确实明白你关于使用地图的意思。很好的答案!
【解决方案2】:

abxy 周围的那些额外括号是不需要的。此外,它们使 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))))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多