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