2014-04-13 4 views
1

나는 REPL (lein-REPL 및 라이트 테이블)에 주위를 연주 해요 그리고 some 기능을 사용하는 방법에 대한 이상한 뭔가를 발견했습니다 :Clojure의 일부 기능에 담고는

(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) 

이상한/정수가있는 정수에 대해 오류가 발생하는 이유는 무엇입니까? 벡터에 없을 때? 대신에 nil을 반환하지 않아야합니까?

답변

4

일부는 진리 값을 얻을 때까지 컬렉션의 각 요소에 술어를 적용합니다.

(some even? [5 :test]) 

some의 경우

(even? 5) ;=> false 

다음 even? 이후

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

가 정수를 필요로를 시도 할 것이다.

는 안개가 해제했다 대신

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

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

보십시오. 답변 해줘서 고마워! – kurofune