14
scala> val l = List()
l: List[Nothing] = List()

scala> l.forall(x=>false)
res0: Boolean = true

scala> l.forall(x=>true)
res1: Boolean = true

scala> l.exists(x=>false)
res2: Boolean = false

scala> l.exists(x=>true)
res3: Boolean = false

对于以上2个谓词,既然列表中不存在任何元素,那么forall怎么会返回true?我很困惑。你能帮忙解释一下吗?

4

3 回答 3

21

您可以改写这forall意味着列表中的任何元素都不会违反给定的谓词。如果没有元素,则它们 不会违反它。

forall如果集合为空,则显式返回 true的源代码:

def forall(p: A => Boolean): Boolean = {
    var these = this
    while (!these.isEmpty) {
       ...
    }
    true
}
于 2013-04-12T22:09:32.847 回答
12

这些方法的语义被选择为与形式逻辑中的普遍和存在量词的语义相一致。

方法forall充当通用量词 -true如果集合中没有谓词所针对的元素,则返回false。如果没有元素,则谓词永远不会为假且forall为真。

方法exists充当存在量词。true如果至少有一个元素是谓词,则返回true。如果没有元素,则谓词永远不会为真并exists返回假。

于 2013-04-12T22:24:51.423 回答
4

合取单位(即and)是true,而析取单位(即or)是false

考虑一个lst带有n元素的列表。

lst.forall(f)相当于

true && f(lst(0)) && ... && f(lst(n-1))

lst.exists(f)相当于

false || f(lst(0)) || ... || f(lst(n-1))

如果列表为空,则只有上述表达式中的第一项。

于 2013-04-14T13:41:39.380 回答