递归地跟随哈希映射clojure中的值

时间:2012-11-18 13:49:56

标签: recursion clojure hashmap

我在为以下递归函数提供边缘情况时遇到问题,该函数搜索哈希映射和其他类似的键值存储。

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

1 个答案:

答案 0 :(得分:2)

您需要在条件函数中处理nil。您可以使用fnilfnil用一些默认值替换nil。所以你可以尝试:

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

如果此条件函数收到nil,则用空字符串“”替换nil,然后调用函数#(> (.length %) 4)

此外,您可以使用count代替.length。对于nil,Count返回0:

(count "123") => 3
(count nil) => 0