2016-05-13 5 views
1

私は現在compと仕事をしようとしており、何かが足りなくなっているようです。 私がよく理解すれば、compは数学的構成と同じ順序で働くので、(comp g f)はg(f(x))に似ています。Clojure:私はコンプに何が欠けていますか?

ので、私は私がnilの値を持つエントリを削除するために、短いnil-key?機能をremoveを使用したいという

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

のようなマップを持っている想像:

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

は私がしようとしましたnil-keyを定義しますか?そのような:

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

それは

は、たぶん私は、私は隠されたmapあったthughtのでremove機能がどのように機能するかを理解していない空のマップ(私は、フィルタを使用している場合、何のマップエントリは削除されません)を返します。

評価:ハッシュマップ 2上の1)第1の地図秒)値は 3 nilであると指示)が一致

を与える私は

(into {} (filter second m)) 

を行うことができしかし、またfalseを除去され、そのしたくない。

もちろん、私は別のアプローチで簡単にやりますが、compの機能を理解したいと思います。

ありがとうございます!

EDIT

答え

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

最終関数

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

答えて

3

あなたのnil-key?定義に誤りがあります。このフォームで、それを使用したい場合は、あなたの述語関数を生成するためにnil-key?を呼び出す必要があります

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

::あなたの関数は、合成機能を生成する関数を返す代わりに

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

そして、それは正しく動作します

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

:あなたは、関数を構成する結果とVARを定義する必要があります

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

ああ私はそれについて考えることさえしませんでした。「実用的に」それは関数だが、プログラム的にはこれが論理的だと思うので、私はdefnを使いました。 –

関連する問題