【问题标题】:Clojure, musings on some functionClojure,对某些功能的思考
【发布时间】:2014-04-13 13:49:43
【问题描述】:

我在 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)

为什么我会收到关于奇数整数的错误?/偶数?当它不在向量中时?它不应该返回 nil 吗?

【问题讨论】:

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


    【解决方案1】:

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

    如果是

    (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
    

    【讨论】:

    • 雾已经散去。谢谢你的回答!
    猜你喜欢
    • 2012-08-17
    • 2013-08-21
    • 1970-01-01
    • 2020-10-04
    • 2021-08-10
    • 1970-01-01
    • 2023-03-11
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多