2012-09-22 5 views
39

私はGoogle検索を試みましたが、まともなforallの例を見つけることができませんでした。それは何をするためのものか?ブール関数を使うのはなぜですか?スカラーはすべての例ですか?

参照(Scaladocを除く)を参照してください。

+6

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html: '述語がこのリストのすべての要素に対して保持されているかどうかをテストします。 ' – MikkoP

+1

多分あなたは思ったので混乱しました'foreach'の機能性の代わりに(すべての要素を反復して) –

+1

はい、私はforeachの並列バージョンを考えていました。 – Jus12

答えて

64

forallメソッドは、ブール値を返す関数pを受け取ります。 forallのセマンティクスによれば、コレクション内のすべてのxについてtrueを返すとp(x)がtrueです。

だから:

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

手段:1、2、および3はそうでなければ3未満、falseであるtrue場合。この場合、それはそうではありませんので、すべての要素が3未満のfalseと評価されます:3 少なくとも一つがある場合trueを返す同様の方法existsがある3

未満ではありませんコレクション内の要素xp(x)が真となります。

だから:

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

手段: 1、2、および3の少なくとも一方が3未満、falseそうでないtrue場合。この場合、いくつかの要素が3未満であるので、trueと評価される。 1が3未満です。

+2

'forall(foo)'は 'foldLeft(true)(x、y)=> x&foo(y))'と同じです。 ' – Jus12

+5

@ Jus12、そうです。短絡評価( 'false 'が見つかると' foo'の評価を止める)。 – dhg

3

Scalaスクリプトを使用してこの機能でどのように遊ぶことができるかの簡単な例です。

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

myScript.scalaファイルを作成し、クロージャ内あなたがより多くのコマンドは、スコープ変数の外に割り当てるEG実行できることを覚えておくことが

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

なぜREPLを使用しないのですか? –

0
また

良いとそれを呼び出す

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

}

関連する問題