1

我有如下代码:

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

它给出了 type mismatch, found Result[Int], required Result[Any],但是如果我将其更改为:

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

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

在我看来,操作在概念上应该没问题,Validation可以是协方差,为什么WriterT不能(或不)decared WriterT[F[_], W, +A](或什至+W)?

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


解决了。
原来是我用错了版本,我用的是"org.scalaz" %% "scalaz-core" % "7.0-SNAPSHOT",换了"org.scalaz" % "scalaz-core_2.9.2" % "7.0.0-M2"就ok了

4

1 回答 1

2

不确定您的情况,但 scalaz-7 树(以及 M2 版本)具有协变类型 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]
于 2012-08-22T04:05:47.350 回答