WriterT可以成为协方差吗?WriterT[F[_],W,A]是否可以改为用+A声明



我有这样的代码:

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]

相关内容

  • 没有找到相关文章

最新更新