Scala 的 Try 单子链
Scala's monadic chaining of Try
考虑以下使用 monadic for-comprehensions 的函数 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 [ _ ]
都是(或应该是)单子,并且应该像草图那样顺利地工作。
你只能在 for comprehension 中使用同类的 monad。在这种情况下,您的所有值都必须是 GenTraversableOnce
,因为第一个是。它适用于 Option
,因为存在从 Option
到 Seq
的隐式转换,但这对于 Try
.
是不可能的
考虑以下使用 monadic for-comprehensions 的函数 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 [ _ ]
都是(或应该是)单子,并且应该像草图那样顺利地工作。
你只能在 for comprehension 中使用同类的 monad。在这种情况下,您的所有值都必须是 GenTraversableOnce
,因为第一个是。它适用于 Option
,因为存在从 Option
到 Seq
的隐式转换,但这对于 Try
.