2016-10-27 2 views
1

エクストラクタには疑問があります。エクストラクタとエクストラクタのエクストラクタの比較

私はこれを行うことができる場合:私はこれを行うことができない理由

val a :: b = List(1, 2, 3) 

:(ガードを使用せずに)

val c = for (a :: b <- List(1, 2, 3) } yield a 
+0

? – ymonad

+0

最初に 'for'が必要なのはなぜですか? 'for'はコレクションを繰り返します。最初の要素だけが必要です。 'val c = List(1,2,3).head'?一回の操作で頭と尾の両方を取得したい場合、最初のパターンマッチングは意味がありますが、2回目は 'b'を削除します。 –

+0

jsonオブジェクトを照会するための複雑な 'for'シーケンスのために必要です。 –

答えて

2

Scalaではfor-yield表現の翻訳はmap機能です。あなたがしようと代わりにmapを使用している場合は、それがコードで癖のように少し明確に見えるでしょう:List[+A]以上

List(1, 2, 3).map((x: Int) => ???) 

ときmap、あなたはそれぞれの値を1つずつ投影します。あなたは高次関数の中にあなたの使い捨てで全リストを持っていません。逆に

、リスト自体にパターンマッチングを使用した場合、コンパイラは(いくつかのクリーンアップ後)にあなたの最初の例を翻訳します:

ケースをマッチング、 List[Int]上のパターンマッチで
def main(args: Array[String]): Unit = { 
    private[this] val x$1: (Int, List[Int]) = List(1, 2, 3) match { 
    case (head: Int, tl: List[Int])scala.collection.immutable.::[Int]((a @ _), (b @ _)) => Tuple2[Int, List[Int]](a, b) 
    }; 

    val a: Int = x$1._1; 
    val b: List[Int] = x$1._2; 
() 

頭と尾のこれは、通常のパターンマッチングのための単純な合成糖です。収量と同じはmapの合成糖です。彼らは単に異なるものをします。

+0

OK、わかりました。 forの構文は何ですか? –

+0

@ david.perez "どのような構文"とはなんですか? –

0

Yuvalの回答後、私はそれが動作しない理由を理解しました。第一値に興味がある場合

同等の構文:あなたは 'C'の値を期待して何をすべきか

val first = for (a <- List(1, 2, 3).headOption) yield a