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?我很迷惑。你能帮忙解释一下吗?
答案 0 :(得分:15)
您可以改写forall
表示列表中没有任何元素违反给定谓词。如果是 没有元素,则不会违反它。
如果集合为空,则forall
的源代码显式返回true:
def forall(p: A => Boolean): Boolean = {
var these = this
while (!these.isEmpty) {
...
}
true
}
答案 1 :(得分:9)
这些方法的语义被选择为与形式逻辑中的通用和存在量词的语义相一致。
方法forall
充当通用量词 - 如果集合中没有谓词为true
的元素,则返回false
。如果没有元素,则谓词永远不会为假,forall
为真。
方法exists
充当存在量词。如果至少有一个谓词为true
的元素,则返回true
。如果没有元素,那么谓词永远不会为真,exists
将返回false。
答案 2 :(得分:2)
连词单位(即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))
如果是空列表,则只有上述表达式中的第一个术语存在。