我在閱讀「Programming in Scala 2nd Edition」,我對從Haskell課程中學到的monad有一些想法。不過,我不明白爲什麼下面的代碼「神奇」的工作原理:如何用scala翻譯多個monad表達式?
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;
^
那麼,什麼是神奇與第一例子嗎?
'Option'不是'GenTraversableOnce' – 2013-02-24 03:29:32
在Option對象中定義了一個名爲option2Iterable的隱式轉換,它可以將Option選項轉換爲Iterable。 – Eastsun 2013-02-24 03:50:21
@LuigiPlinge:是的。我已經更新了答案以解釋這是如何工作的。 – ruakh 2013-02-24 04:25:19