3

Clojure I/O (または型システム) に厄介な問題があるようです。ポイントは、この関数は、文字列と数値または文字列のコレクションのコレクションを消費することを期待しており、数値に関連付けられた文字列の辞書を返すことです。

(costlist '( '("Milk" 4) '("Bread" 2) '("Milk")))

与える

{"Milk" 4, "Bread" 2 }

によって定義されます

(defn costlist [lst]
    ;returns list of costs and appropriate names
          (let  [snds (filter (fn [x] (not (identical? nil x))) (seconds lst))]
          (zipmap 
                   (firsts (take (count snds) (firsts lst))) 
                   (snds  lst))))

タイプ clojure.lang.PersistentList (私は clojure.lang.LazySeq から変換したもの) のリストを消費すると、エラー メッセージがスローされます

clojure.lang.LazySeq cannot be cast to clojure.lang.IFn

その引数のいずれもが私には LazySeq ではないように見えるので、これは私を混乱させるだけです。

4

3 に答える 3

4

問題はsnds、レイジー seq であるため(snds lst)、エラーがスローされることです。filter常にレイジー seq を返します。

あなたの機能も複雑すぎます。もっと簡単にしてみてください:

(defn costlist [lst]
  (zipmap (map first lst)
          (remove nil? (map second lst))))

これで、やりたいことができます:

(costlist (list '("Milk" 4) '("Bread" 2) '("Milk")))

式の評価を防ぐlistために使用しています( ToBeReplacedの回答を参照):quote

=> '( '("Milk" 4) '("Bread" 2) '("Milk"))
((quote ("Milk" 4)) (quote ("Bread" 2)) (quote ("Milk")))

quoteしたがって、リストの作成には使用しないでください。

nilあなたのソリューションは、値がリストの最後にのみ発生する可能性があることも示唆しています。簡単に修正できます:

(defn costlist [lst]
  (->>  (filter (comp #{2} count) lst)
        (map vec)
        (into {})))

だから、今

(costlist (list '("Milk" 4) '("Milk") '("Bread" 2)))

も機能します。

于 2013-08-06T14:08:23.300 に答える