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。要素がない場合、述語は決して false ではなく、foralltrue です。

メソッドexistsは存在量指定子として機能します。true述語が である要素が少なくとも 1 つある場合に返されますtrue。要素がない場合、述語は true になることはなく、existsfalse を返します。

于 2013-04-12T22:24:51.423 に答える