斯卡拉的尝试的monadic链接

Mar*_*ger 6 monads scala scala-collections

考虑以下函数链接f,gh使用monadic for-ereherehension.

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

如果f,g并且h都有签名:

  Int => Option [ Int ] 
Run Code Online (Sandbox Code Playgroud)

然后for-comprehension编译好.但是,如果我取代Option [ Int ]Try [ Int ],Scala的类型inferencer抱怨线路

  y <- f ( x )
Run Code Online (Sandbox Code Playgroud)

以下错误消息.

  error: type mismatch;
  found   : scala.util.Try[Int]
  required: scala.collection.GenTraversableOnce[?]
      y <- f ( x )
Run Code Online (Sandbox Code Playgroud)

为什么?两个Option [ _ ]Try [ _ ]是(或应是)单子,并且如勾勒应顺利工作.

dre*_*xin 9

您只能在理解中使用相同类型的monad.在这种情况下,您的所有值都必须是GenTraversableOnce,因为第一个值是.它的工作原理与Option,因为从一个隐式转换OptionSeq,但是这是不可能的Try.

  • 它可能不像你想象的那么简单.例如:上面示例的返回类型应该是什么?从逻辑上讲,它必须是`List`或其中的一些超类型.那么`Try`如何适应?你能把`List`转换成'Try`吗?或者"尝试"到"列表"?对于这两个问题,答案是否定的(至少如果你想保留所有信息). (3认同)