似乎我必须缺少一些明显常用的习语,但缺少这两个功能对我来说似乎有点困惑。有some
但它返回nil
而不是False
,为什么不是any?
函数?
答案 0 :(得分:11)
some
被认为与any?
相同(如果它存在)。有一个密切命名的函数not-any?
,它只是在引擎盖下调用some
:
(source not-any?)
(def
...
not-any? (comp not some))
你可以简单地写任何:
(def any? (comp boolean some))
欢迎补丁:)只需填写并先在订阅者协议中邮寄。
关于命名的观点尤其正确,因为自1.0以来已包含not-any?
函数
(defn any? [pred col] (not (not-any? pred col)))
(any? even? [1 2 3])
true
(any? even? [1 3])
false
我猜没有人可以发送补丁? (暗示提示nudge nudge)
当使用任何基于some
的代码(not-any?
调用一些内容时)小心匹配pred和col的类型或使用捕获类型异常的pred
(if (some odd? [2 2 nil 3]) 1 2)
No message.
[Thrown class java.lang.NullPointerException]
ps:这个例子来自clojure 1.2.1
答案 1 :(得分:9)
nil
评估为false。 (if nil 1 2)
评估为2。
some
返回满足谓词的第一个元素。任何不是nil
或false
的内容都会评估为true。所以(if (some odd? [2 2 3]) 1 2)
评估为1.
答案 2 :(得分:3)
您正在寻找some-fn
,但您必须通过boolean
来设置它生成的谓词的返回值。
user> (doc every-pred)
-------------------------
clojure.core/every-pred
([p] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])
Takes a set of predicates and returns a function f that returns true if all of its
composing predicates return a logical true value against all of its arguments, else it returns
false. Note that f is short-circuiting in that it will stop execution on the first
argument that triggers a logical false result against the original predicates.
nil
user> (doc some-fn)
-------------------------
clojure.core/some-fn
([p] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])
Takes a set of predicates and returns a function f that returns the first logical true value
returned by one of its composing predicates against any of its arguments, else it returns
logical false. Note that f is short-circuiting in that it will stop execution on the first
argument that triggers a logical true result against the original predicates.
nil
这些功能与every?
和some
类似的方式类似。
答案 3 :(得分:1)
这些似乎正在解决“任何”问题。这个问题还提到了“any-pred”这样的事情怎么样?
(defn any-pred [preds] (comp not(应用every-pred(map#(comp not%)preds))))
这需要一个集合而不是多个参数,但更改它会很容易。
示例:
=> (def p(any-pred [(partial =“a”)(partial =“b”)]))
=> (p“a”)真实
=> (p“b”)true
=> (p“c”)false
答案 4 :(得分:1)
随着即将发布的Clojure 1.9的发布,这已经发生了变化,它将添加一个any?
函数,该函数将在任何输入上返回true。
定义只是(defn any? [x] true)
,添加它的提交是0929d1。
some
,any?
,not-any?
,every?
,not-every?
请注意,此any?
不否定not-any?
,就像您根据every?
和not-every?
的实施方式所预期的那样,但是一个全新的功能。如果你正在寻找not-any?
的否定(取消否定?),那么使用的函数仍为some
。
答案 5 :(得分:0)
您可以像这样定义any-pred:
(defn any-pred [& preds](补(应用every-pred(地图补语preds))))
或
(defn any-pred [& preds](fn [v](布尔值(某些#(%v)preds))))