2013-04-12 7 views
5
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 

Für oben 2 Prädikat, jetzt, da kein Element in der Liste existiert, wie kommt es für alle Rückkehr wahr? Ich bin verwirrt. Könntest du mir jemanden erklären helfen?scala forall und exists output, macht es Sinn

+2

Der Fall, dass das Forall auf einer leeren Liste wahr ist, wird "vacuumly true" genannt. –

Antwort

14

Sie könnten umformulieren, dass forall bedeutet, dass keines der Elemente der Liste das gegebene Prädikat verletzt. Wenn keine Elemente sind, verletzt keine von ihnen es.

Der Quellcode von forall explizit wahr, wenn eine Sammlung leer ist:

def forall(p: A => Boolean): Boolean = { 
    var these = this 
    while (!these.isEmpty) { 
     ... 
    } 
    true 
} 
8

Die Semantik dieses Verfahrens wurde gewählt, mit der Semantik des Allgemeines und dem Existenzquantor in der formalen Logik kohärent zu sein.

Methode forall fungiert als Allquantor - es gibt true, wenn kein Element in der Auflistung ist, für die das Prädikat false ist. Wenn keine Elemente vorhanden sind, ist das Prädikat nie falsch und forall ist wahr.

Methode exists wirkt als der existenzielle Quantifizierer. Es gibt true zurück, wenn mindestens ein Element vorhanden ist, für das das Prädikat true lautet. Wenn keine Elemente vorhanden sind, ist das Prädikat nie wahr und exists gibt false zurück.

0

Einheit der Verbindung (d. and) ist true während Einheit der Disjunktion (d.h. or) ist false

eine Liste von lst mit n Elemente in Betracht.

lst.forall(f) äquivalent zu

true && f(lst(0)) && ... && f(lst(n-1)) 

lst.exists(f) äquivalent zu

false || f(lst(0)) || ... || f(lst(n-1)) 

Bei einer leeren Liste, nur erster Term in obigen Ausdrücken ist dort.