Clojure:我在comp中缺少什么?

时间:2016-05-13 08:08:38

标签: clojure function-composition

我目前正试图与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))

它返回一个空地图(如果我使用过滤器,则不会删除地图条目)

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

喜欢:1)首先在hashmap上映射第二个        2)告诉值是否为零        3)给出匹配的

我能做到

(into {} (filter second m))

但也删除false,我不想这样做。

当然,我可以通过不同的方法轻松完成,但我想了解comp函数。

谢谢!

编辑

答案

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

最终功能

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

1 个答案:

答案 0 :(得分:3)

您的nil-key?定义中存在错误。您的函数返回一个函数,该函数将生成一个组合函数:

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