【问题标题】:every? identity in Clojure每一个? Clojure 中的身份
【发布时间】:2015-09-02 21:27:28
【问题描述】:

我不明白为什么 every?identity 的组合在以下两个示例中会给出不同的结果。似乎在 true false 集合上调用它时给出了预期的答案,但不是数字和字符串:

(every? identity [1 2 3 4])=> true

(every? identity [true true false])=> false

【问题讨论】:

  • 您期待什么结果?
  • 我在想identity每次都将coll的args传递给every?every?检查它们的真实值,通过coll并返回true,如果所有的args都有与第一个相同的真实值。所以every? 不会强制identityevery? 遍历coll 时传递其他参数的真实值?

标签: clojure identity


【解决方案1】:

在后一种情况下every? 将返回false 是有道理的,因为测试集合中的元素之一是false;即:

=> (identity false)
false

every? 穿过向量并遇到上述应用程序时,它看到一个假值,因此返回。

=> (doc every?)
-------------------------
clojure.core/every?
([pred coll])
  Returns true if (pred x) is logical true for every x in coll, else
  false.

【讨论】:

  • 如果是真假参数,我可以看到逻辑,但数字 identity 返回数字本身,它是 java.lang.Long,而不是真实值。因此我认为它会等于(every? #(= % 1) [1 2 3 4])。令我困惑的是:identity 返回它从 coll 获得的第一个参数,将其作为谓词传递给 every?,然后是every?对照第一个论点检查其余的每一个论点? (every? identity [false true true]) 也返回 false,这是否意味着每个?检查通过身份传递给它的第一个值与其他值?
  • @AmirTeymuri,在 Clojure 中,除了 falsenil 之外,每个值都是“真实的”。见stackoverflow.com/q/5830571/2472391
  • @AmirTeymuri — 不,identity 不仅仅应用于第一个元素。 every? 应用了谓词(在这种情况下,identity)应用于集合中的 每个 元素,直到它到达集合的末尾(在这种情况下 every? 返回 true ) 或谓词 (identity) 返回一个“假”值(即nilfalse),在这种情况下every? 返回false
【解决方案2】:

这是来自每个人的 clojure 文档?:

如果 (pred x) 对于 coll 中的每个 x 都为逻辑真,则返回真,否则 假的。

通过对数组中的 false 值评估 (identity),您将得到 false,因为 false 的标识为 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多