0

私はこのコードを持っています。

(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: 間違った数の引数 (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

私はしばらくこれに座っていましたが、何が悪かったのかまだわかりません。ここで何が間違っていますか?

4

1 に答える 1

7

関数のようにムービー (マップ) を呼び出しています。ルックアップ用のキーを使用してマップを呼び出すことができますが、アリティが 0 の形式はありません。おそらく、ムービーを呼び出すのではなく、ムービーを返したいだけです (かっこで囲みます)。

(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)))
于 2014-11-11T05:25:52.227 に答える