【问题标题】:Arity exception in clojureclojure 中的 Arity 异常
【发布时间】:2014-11-11 05:11:09
【问题描述】:

我有这段代码。

(defn get-movie [name-movie contents]
 (loop [n (count contents) contents contents]
  (let [movie (first contents)]
   (if (= (:name (first contents)) name-movie)
    (movie)
    (recur (dec n) (rest contents))))))

我有一系列地图({:id, :name, :price} {} {})。我需要找到我给出的 :name 的地图(匹配电影)。当我给

(get-movie "Interstellar" contents)

内容在哪里

({:id 10000 :name "Interstellar" :price 1}{:id 10001 :name "Ouija" :price 2}). 

我收到以下异常。 :

clojure.lang.ArityException:传递给的 args (0) 数量错误:PersistentArrayMap AFn.java:437 clojure.lang.AFn.throwArity AFn.java:35 clojure.lang.AFn.invoke C:\Users\Shalima\Documents\Textbooks\Functional Programming\Programs\Assignment5.clj:53 file.test/get-movie C:\Users\Shalima\Documents\Textbooks\Functional Programming\Programs\Assignment5.clj:77 file.test/eval6219

我已经坐了一段时间了,但仍然无法弄清楚出了什么问题。我在这里做错了什么?

【问题讨论】:

    标签: exception clojure arity


    【解决方案1】:

    您正在像函数一样调用电影(地图)。可以使用键调用映射以进行查找,但没有 0-arity 形式。大概您只想返回电影而不是调用它(通过用括号括起来)。

    (defn get-movie [name-movie contents]
     (loop [n (count contents) contents contents]
      (let [movie (first contents)]
       (if (= (:name (first contents)) name-movie)
        movie   ;; don't invoke
        (recur (dec n) (rest contents))))))
    

    对于这个问题并不重要,但是用解构来编写这个循环的一种更简单的方法是:

    (defn get-movie [name-movie contents]
     (loop [[{n :name :as movie} & movies] contents]
      (if (= n name-movie)
       movie   ;; don't invoke
       (recur movies))))
    

    如果您想转移到更高阶的序列函数并完全远离较低级别的循环,您可以执行以下操作:

    (defn get-movie [name-movie contents]
     (first (filter #(= name-movie (:name %)) contents)))
    

    【讨论】:

    • 哦,是的。我真是太愚蠢了...非常感谢...有很多方法可以改进 clojure 代码。我还在努力向上。希望会在某个时候到达那里。
    • 再问一个问题。解码异常堆栈的最佳方法是什么。它没有给出代码行,我们如何找出哪里出了问题?
    • 您列出的堆栈中有“C:\Users\Shalima\Documents\Textbooks\Functional Programming\Programs\Assignment5.clj:53” - 这不是有问题的代码行吗?跨度>
    • 不。它是函数 get-movie 的开始。
    • 有几个与行号报告相关的错误(尽管乍一看这不像其中之一)。不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多