我在阅读“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