我有这样的代码:
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]
(甚至与+W
)?
我使用的是scalaz7快照,但我看到6.0.4中WriterT的声明是相同的。
已解决
事实证明,我使用了错误的版本,我使用的是"org.scalaz" %% "scalaz-core" % "7.0-SNAPSHOT"
,一旦我切换到"org.scalaz" % "scalaz-core_2.9.2" % "7.0.0-M2"
,就可以了
不确定您的情况,但scalaz七树(以及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]