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?我很困惑。有人能帮我解释一下吗?
您可以将forall
重新表述为列表中没有元素违反给定谓词。如果有没有元素,它们都不违反它。
如果集合为空,forall
的源代码显式返回true:
def forall(p: A => Boolean): Boolean = {
var these = this
while (!these.isEmpty) {
...
}
true
}
选择这些方法的语义是为了与形式逻辑中全称量词和存在量词的语义一致。
方法forall
充当通用量词—如果集合中没有谓词为false
的元素,则返回true
。如果没有元素,则谓词永远不为假,forall
为真。
方法exists
作为存在量词。如果至少有一个元素的谓词是true
,则返回true
。如果没有元素,则谓词永远不为真,并且exists
返回false。
连接单位(即:and
)为true
,而析取单位(即or
)为false
考虑一个包含n
元素的列表lst
。
lst.forall(f)
等价于
true && f(lst(0)) && ... && f(lst(n-1))
lst.exists(f)
等价于
false || f(lst(0)) || ... || f(lst(n-1))
在空列表的情况下,上述表达式中只有第一个项存在。