Scala 的 Try 单子链

Scala's monadic chaining of Try

考虑以下使用 monadic for-comprehensions 的函数 fgh 链接。

  for {
    x <- List ( 11, 22, 33, 44, 55 )
    y <- f ( x )
    z <- g ( y )
    a <- h ( z )
  } yield a

如果fgh都有签名:

  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,因为存在从 OptionSeq 的隐式转换,但这对于 Try.

是不可能的