Clojure:comp 缺少什么?

Clojure : what am I missing from comp?

我目前正在尝试使用 comp,看起来我遗漏了什么。 如果我理解得很好,comp 的工作顺序与数学组合相同,所以 (comp g f) 就像 g(f(x)).

假设我有一张那样的地图

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

我想使用 remove 和一个简短的 nil-key? 函数来删除具有 nil 值的条目,所以 :

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

我试图定义 nil-key?像那样:

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

它returns一个空地图(如果我使用过滤器,没有地图条目被删除)

也许我不明白 remove 函数是如何工作的,因为我认为有一个隐藏的 map.

赞:1) hashmap 上的第一个 map 第二个 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 {})))

您的 nil-key? 定义有误。您的函数 returns 一个将生成组合函数的函数:

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

如果您想以这种形式使用它,您必须调用 nil-key? 才能生成谓词函数:

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

相反,您应该使用组合函数的结果定义一个 var:

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

然后它将正常工作:

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