使forall和exists在空列表上的输出有意义


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))

在空列表的情况下,上述表达式中只有第一个项存在。

相关内容

最新更新