2

ハッシュマップや他の同様のキー、値ストレージを検索する次の再帰関数のエッジケースを提供するのに問題があります。

(def hashbrownies
  {"Mary","Dave"
   "Dave","Anne"
   "Anne","Tim"})

現在のアプローチ

(defn recursive-lookup
  [key-lst search-func conditional]
  (let [next-key (search-func (first key-lst))]
    (if (conditional next-key)
      (reverse key-lst)
      (recur (cons next-key key-lst) search-func conditional))))

動作している例

>> (recursive-lookup ["Mary"] #(hashbrownies %) (partial = nil))
=> ("Mary" "Dave" "Anne" "Tim")

>> (recursive-lookup ["Mary"] #(hashbrownies %) #(< (.length %) 4))
=> ("Mary" "Dave" "Anne")

問題がある:

>> (recursive-lookup ["Mary"] #(hashbrownies %) #(> (.length %) 4))
=> NullPointerException   clojure.lang.Reflector.invokeNoArgInstanceMember (Reflector.java:296)

問題が何であるかがわかります。条件を満たせないため、関数#(> (.length %) 4)nil(最後の可能な戻り値)を引数として取ります。しかし、Clojureを初めて使用するので、これをどのようにカバーするかわかりません。慣用的な方法はありますか?

解決:

(defn recursive-lookup
  [key-lst search-func conditional]
  (let [next-key (search-func (first key-lst))]
    (if (or (nil? next-key)
            (conditional next-key))
      (reverse key-lst)
      (recur (cons next-key key-lst) search-func conditional))))
4

1 に答える 1

2

nil条件関数で処理する必要があります。そのためにfnilを使用できます。fnilnilをデフォルト値に置き換えます。だからあなたは試すことができます:

(fnil #(> (.length %) 4) "")

この条件関数が受信すると、空の文字列 ""nilに置き換えnilられ、関数が呼び出されます#(> (.length %) 4)

countまた、代わりに使用することもできます.length。カウントはnilに対して0を返します:

(count "123") => 3
(count nil) => 0
于 2012-11-18T14:03:23.883 に答える