2016-05-13 54 views
1

我目前正试图与comp一起工作,它看起来像我失去了一些东西。 如果我理解的很好,comp的工作顺序与数学成分相同,所以(comp g f)就像g(f(x))。Clojure:我从comp中错过了什么?

想象我有一个像那样的地图

(def m {:a 1 :b nil :c 3}) 

我想用remove用短nil-key?函数删除其具有零值的条目,所以:

(into {} (remove nil-key? m)) = {:a 1 :c 3} 

我试着定义无钥匙?这样的:

(defn nil-key? [] 
    (comp nil? second)) 

它返回一个空的映射(如果我使用过滤器,没有映射条目被删除)

也许我不明白remove功能是如何工作的,因为我thught有一个隐藏map

喜欢:1)的散列映射 2第一地图第二)告知用户,如果值是nil 3)得到匹配

我可以做

(into {} (filter second m)) 

但也除去false,这我不想。

当然,我可以用一种不同的方法很容易地做到这一点,但我想了解comp函数。

谢谢!

编辑

答案

(def nil-key? 
    (comp nil? second)) 

最终的功能

(defn remove-nil-keys [map] 
    (->> (remove nil-key? map) 
     (into {}))) 

回答

3

您的nil-key?定义一个错误。你的函数返回,这将产生一个由函数功能:

(defn nil-key? [] 
    (comp nil? second)) 

如果你想以这种形式来使用它,你将不得不调用nil-key?以产生你的断言函数:

(into {} (remove (nil-key?) m)) 
;; => {:a 1, :c 3} 

相反你应该定义一个变种与构成该功能的结果:

(def nil-key? (comp nil? second)) 

然后,它会正常工作:

(into {} (remove nil-key? m)) 
;; => {:a 1, :c 3} 
+0

噢是的我甚至没有想到这一点,我用defn,因为“务实”这是一个函数,但编程这似乎是逻辑,谢谢! –