Scala';Try的一元链

Scala';Try的一元链,scala,monads,scala-collections,Scala,Monads,Scala Collections,考虑以下函数链接f,g和h,使用单子进行理解 for { x <- List ( 11, 22, 33, 44, 55 ) y <- f ( x ) z <- g ( y ) a <- h ( z ) } yield a 那么对于理解来说,编译就很好了。但是,如果我将选项[Int]替换为 Try[Int],Scala的类型推断器抱怨这行代码 y <- f ( x ) y为了理解,你只能使用同一类型的单子。在这种情况下,

考虑以下函数链接
f
g
h
,使用单子进行理解

  for {
    x <- List ( 11, 22, 33, 44, 55 )
    y <- f ( x )
    z <- g ( y )
    a <- h ( z )
  } yield a
那么对于理解来说,编译就很好了。但是,如果我将
选项[Int]
替换为
Try[Int]
,Scala的类型推断器抱怨这行代码

  y <- f ( x )

y为了理解,你只能使用同一类型的单子。在这种情况下,所有值都必须是
GenTraversableOnce
,因为第一个值是。它与
选项
一起工作,因为有一个从
选项
序列
的隐式转换,但是这对于
Try

是不可能的,下面是一个较短的演示{x谢谢。如果我想以一元模式链接我的计算,但也传播错误消息,那么推荐的Scala方法是什么?你应该看看monad transformers。我建议你使用scalaz。我很惊讶,概念上简单的链接monad需要“重型设备”。它可能不像simp那样简单例如:你上面例子的返回类型应该是什么?逻辑上它必须是
List
或者它的一些超类型。那么
Try
如何适应呢?你能把
List
转换成
Try
?或者把
Try
转换成
List
?这两个问题的答案都是否定的(至少如果您想保留所有信息).你是对的。我现在明白了,我确实需要一个monad转换器,因为我在这里尝试使用两个monad,
List
Try
。我被
选项
的工作弄糊涂了,但我没有意识到有一个隐式转换将
选项
强制转换成一个合适的序列monad。我现在确切地知道如何解决我的问题问题,谢谢你的帮助。
  y <- f ( x )
  error: type mismatch;
  found   : scala.util.Try[Int]
  required: scala.collection.GenTraversableOnce[?]
      y <- f ( x )