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}
我目前正在尝试使用 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}