使用monadic for-erehensions考虑以下函数f
,g
和h
的链接。
for {
x <- List ( 11, 22, 33, 44, 55 )
y <- f ( x )
z <- g ( y )
a <- h ( z )
} yield a
如果f
,g
和h
都有签名:
Int => Option [ Int ]
然后for-comprehension编译好。但是,如果我将Option [ Int ]
替换为
Try [ Int ]
,Scala的类型推理器抱怨行
y <- f ( x )
,出现以下错误消息。
error: type mismatch;
found : scala.util.Try[Int]
required: scala.collection.GenTraversableOnce[?]
y <- f ( x )
为什么呢? Option [ _ ]
和Try [ _ ]
都是(或应该是)monad,并且应该如草绘一样顺畅。
答案 0 :(得分:9)
您只能在理解中使用相同类型的monad。在这种情况下,您的所有值都必须为GenTraversableOnce
,因为第一个值是。{1}}。它适用于Option
,因为存在从Option
到Seq
的隐式转换,但Try
无法做到这一点。