Clojure,思考一些功能

时间:2014-04-13 13:49:43

标签: function vector clojure read-eval-print-loop

我在repl(lein-repl和light table)上玩游戏并注意到使用some函数时有些奇怪:

(def my-vec [5 :test])
(some even? my-vec)     
;=>  java.lang.IllegalArgumentException: Argument must be an integer: :test
;            core.clj:1351 clojure.core/even?
;            core.clj:2515 clojure.core/some

(some odd? my-vec)      ;=> true
(some integer? my-vec)  ;=> true
(some map? my-vec)      ;=> nil

(def my-vec2 [4 :test])
(some even? my-vec2)     ;=> true
(some odd? my-vec2) 
;=> java.lang.IllegalArgumentException: Argument must be an integer: :test
;            core.clj:1351 clojure.core/even?
;            core.clj:1357 clojure.core/odd?
;            core.clj:2515 clojure.core/some

(some integer? my-vec)  ;=> true
(some map? my-vec)      ;=> nil

some的文档说:

some
clojure.core
([pred coll])
Returns the first logical true value of (pred x) for any x in coll,
  else nil.  One common idiom is to use a set as pred, for example
  this will return :fred if :fred is in the sequence, otherwise nil:
  (some #{:fred} coll)

为什么我会收到有关奇数?/偶数的整数的错误?什么时候不在矢量中?不应该返回零,而不是吗?

1 个答案:

答案 0 :(得分:4)

有些人会将谓词应用于集合的每个元素,直到它获得真值。

的情况下
(some even? [5 :test])

some会尝试

(even? 5) ;=> false

然后

(even? :test) ;=> Exception...

因为even?需要一个整数。

尝试改为

(some (every-pred integer? even?) [5 :test])
;=> nil

(some (every-pred integer? even?) [5 6 :test])
;=> true