私は「Programming in Scala 2nd Edition」を読んでいます。私が取ったハスケルコースからモナドについて考えています。複数のモナドを持つfor式をscalaでどのように変換しますか?
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)
がのタイプであり、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;
^
それでは、最初の例と魔法のですか?
'Option'は' GenTraversableOnce'ではありません –
Optionオブジェクトに定義されているoption2Iterableという暗黙的な変換があり、これはOptionをIterableに変換することができます。 – Eastsun
@LuigiPlinge:はい、そうです。私はそれがどのように動作するか説明するために答えを更新しました。 – ruakh