「ProgramminginScala2nd Edition」を読んでいて、私が受講したHaskellコースのモナドについていくつか考えています。ただし、次のコードが「魔法のように」機能する理由がわかりません。
scala> val a: Option[Int] = Some(100)
a: Option[Int] = Some(100)
scala> val b = List(1, 2, 3)
b: List[Int] = List(1, 2, 3)
for ( y <- b; x <- a ) yield x;
res5: List[Int] = List(100, 100, 100)
本の第23.4章によると、for
表現は次のように翻訳されているので、私は上記を理解していません。
b flatMap ( y =>
a map ( x => x )
)
y => a map (x => x)
が型Int => Option[Int]
であるために上記のコードがコンパイルされる理由に戸惑いますが、は。をb.flatMap
期待していInt => List[Something]
ます。
一方、次のコードはコンパイルされません(これは良いことです。さもないと私はもっと失われてしまいます):
scala> for ( x <- a; y <- b ) yield y;
<console>:10: error: type mismatch;
found : List[Int]
required: Option[?]
for ( x <- a; y <- b ) yield y;
^
では、最初の例の魔法は何ですか?