斯卡拉的尝试的monadic链接

时间:2015-06-28 08:51:41

标签: scala monads scala-collections

使用monadic for-erehensions考虑以下函数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 [ _ ]都是(或应该是)monad,并且应该如草绘一样顺畅。

1 个答案:

答案 0 :(得分:9)

您只能在理解中使用相同类型的monad。在这种情况下,您的所有值都必须为GenTraversableOnce,因为第一个值是。{1}}。它适用于Option,因为存在从OptionSeq的隐式转换,但Try无法做到这一点。