scala forall并且存在输出,它是否有意义

时间:2013-04-12 22:05:26

标签: scala

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?我很迷惑。你能帮忙解释一下吗?

3 个答案:

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

如果是空列表,则只有上述表达式中的第一个术语存在。