2012-09-22 12 views
39

Próbowałem wyszukiwania Google i nie można znaleźć przyzwoity przykład forall. Co to robi? Dlaczego zajmuje funkcję boolowską?Scala przykład allall?

Proszę wskazać mi odniesienie (z wyjątkiem Scaladoc).

+6

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html: 'Sprawdza, czy predykat zawiera wszystkie elementy tej listy." – MikkoP

+1

Może wpadłeś w zakłopotanie, ponieważ myślałeś funkcjonalności 'foreach' zamiast tego (iteracja przez wszystkie elementy) –

+1

Tak, myślałem, że jest to równoległa wersja foreach. – Jus12

Odpowiedz

64

Metoda forall przyjmuje funkcję p, która zwraca wartość logiczną. Semantyka z forall mówi: return true, jeśli dla każdego x w kolekcji, p(x) jest true.

Tak więc:

List(1,2,3).forall(x => x < 3) 

oznacza true jeśli 1, 2 i 3 jest mniejsza niż 3, false inaczej. W tym przypadku będzie to ocenić na false ponieważ nie jest w przypadku wszystkie elementy są mniejsze niż 3: 3, jest nie mniejsza niż 3.

Jest podobny sposób exists która zwraca true jeśli istnieje przynajmniej jeden element x w kolekcji taki, że p(x) jest prawdziwy.

Tak więc:

List(1,2,3).exists(x => x < 3) 

oznacza truejeśli co najmniej jeden z 1, 2 i 3, jest mniejsza niż 3, false inaczej. W takim przypadku oceniany jest na true, ponieważ jest tak, że element jest mniejszy niż 3: np. 1 to mniej niż 3.

+2

więc 'forall (foo)' jest równoważne 'foldLeft (true) ((x, y) => x & foo (y))' – Jus12

+5

@ Jus12, tak, z poprawką, że używa '&&', ponieważ robi ocena zwarcia (przestaje oceniać 'foo', jeśli znajdzie" fałsz "). – dhg

3

Szybki przykład, jak można grać z tą funkcją przy użyciu skryptu Scala.

utworzyć plik myScript.scala z

println(args.forall(p => (p.equals("a")))) 

i nazywają go

scala myScript.scala a a a // true 
scala myScript.scala a b c // false 
+4

dlaczego nie używać REPL? –

0

również dobre, aby pamiętać, że w swoim zamknięciu można wykonać kolejne polecenia, np przypisanie z zmiennych zakresu

def main(args: Array[String]){ 
var country = "" 
var environment = "" 

val isValid = args.sliding(2, 2).forall{ 
    case Array("--env", value : String) => { 
    environment = value 
    Array("test", "staging", "prod").contains(value.toLowerCase()) 
    } 
    case Array("--country", value : String) => { 
    country = value 
    Array("BE", "NL", "FR").contains(value.toLowerCase()) 
    } 
    case _ => false 
} 

if(!isValid){ 
    println ("Wrong usage. Please insert params in the following format: --country {NL,BE,UK,FR} --env {test, staging, prod}") 
    return 
} 
else 
    println (s"Correct usage. env=$environment country=$country") 

}