我正在阅读“Scala 2nd Edition 中的编程”,并且从我参加的 Haskell 课程中对 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)
是 type Int => Option[Int]
,而b.flatMap
期望 a 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;
^
那么第一个例子有什么神奇之处呢?