当Disjunction是最外面的容器时,如何使用Monad Transformer?

时间:2014-03-14 18:20:32

标签: scala monads monad-transformers scalaz7

val vLInts = (1 to 10).toList.right[String]

for {
  i <- ListT(vLints)
  _ = println(i)
} yield i

//error: no type parameters for method apply:(underlying: M[List[A]])scalaz.ListT[M,A] in object ListT exist so that it can be applied to arguments (scalaz.\/[String,List[Int]])

这里的问题是析取\/[A, B]有2个泛型,因此不是Monad。当我做一个类型别名

type Attempt[A] = \/[String, A]

它成功了,因为我已经固定左侧,我现在有Monad。如果最外面的类型是Disjunction,如何在不使用类型别名的情况下让我的Monad Transformer工作?

1 个答案:

答案 0 :(得分:2)

for{
i <- ListT[({type l[+a] = String \/ a})#l,Int](vLints)
_ = println(i)
} yield i

显然,答案是一种类型的lambda。它不漂亮,但它有效。