为什么Clojure没有?还是什么?功能?

时间:2012-02-28 23:25:56

标签: clojure

似乎我必须缺少一些明显常用的习语,但缺少这两个功能对我来说似乎有点困惑。有some但它返回nil而不是False,为什么不是any?函数?

6 个答案:

答案 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返回满足谓词的第一个元素。任何不是nilfalse的内容都会评估为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

回复: someany?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))))