14

从示例和对 Clojuredoc 的功能的评论中, 每个?

user> (every? true? '())    ;empty is true? 
true

user> (every? false? '())    ;empty is false? 
true

这确实很奇怪,而且可能不合逻辑,因为我认为上述两者都是错误的。有人可以阐明这背后的基本原理吗?

4

2 回答 2

39
于 2013-07-04T04:09:52.463 回答
6

我们有 3 种可能的情况,一次只有一种适用于集合。

  • 集合有项目,他们都通过谓词 - 真
  • coll 中的一项未通过谓词 - False
  • 科尔是空的 - ??

现在,如果您考虑为空列表返回 false ,也会感觉很奇怪,因为当 coll 中的至少一项未通过谓词但对于未发生的空列表时返回 false 。

我认为为空 coll 选择 true 的合理性是基于这样一个事实,即在现实世界中适用的情况比没有意义的情况更多。例如:有人给了我一个 URL 列表,我需要返回他们下载的内容,现在我的函数首先要验证每个 URL 的格式是否正确,然后使用 map 或 pmap 下载 URL -

(if (every? url? urls) (map download urls) (throw "Invalid url found"))

这个以及更多此类示例将使序列的工作更加无缝。

另一方面,我是一个静态类型语言的人(比如 Haskell),并且更喜欢使用类型来解决这个问题。而不是返回一个真或假,我希望这个函数返回Maybe bool这样的:

  • coll 中的每个项目都通过谓词 -Just True
  • coll 中的一项未通过谓词 -Just False
  • 科尔是空的 -Nothing
于 2013-07-04T04:16:07.747 回答