我的代码如下:
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"
就可以了
答案 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]