2016-05-13 57 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,因爲「務實」這是一個函數,但編程這似乎是邏輯,謝謝! –