WriterT可以制作协方差吗? WriterT [F [_],W,A]可以用+ A声明吗?

时间:2012-08-22 03:28:12

标签: scala covariance scalaz

我的代码如下:

type StringValidation[+A] = Validation[String, A]
type WriterValidation[A] = WriterT[StringValidation, String, A]
type Result[A] = WriterValidation[A]

private def someResult: Result[Int]
def implementTrait: Result[Any] = someResult    // type mismatch

它提供了类型不匹配,找到Result[Int],必需Result[Any],但如果我将其更改为:

type WriterValidation[+A] = WriterT[StringValidation, String, A]

它给出了“协变类型A出现在WriterT中的不变位置......”

我觉得这个操作在概念上应该是正常的,Validation可以是协方差,为什么WriterT不能(或不是)贬低WriterT[F[_], W, +A](甚至是{{} 1}})?

我正在使用scalaz7快照,但我看到6.0.4中WriterT的声明是相同的。


解决。
事实证明我使用了错误的版本,我使用的是+W,一旦我切换到"org.scalaz" %% "scalaz-core" % "7.0-SNAPSHOT"就可以了

1 个答案:

答案 0 :(得分:2)

不确定您的情况,但scalaz-seven树(以及M2版本)有 covariant type args

    sealed trait WriterT[F[+_], +W, +A] { ...

以下作品:

    scala> type SV[+A] = Validation[String, A]
defined type alias SV

scala> type WV[+A] = WriterT[SV, String, A]
defined type alias WV

scala> type Result[+A] = WV[A]
defined type alias Result

scala> def someResult: Result[Int] = ???
someResult: Result[Int]

scala> def implementTrait: Result[Any] = someResult
implementTrait: Result[Any]