如何转换 monad 转换器类型?

How to upcast a monad transformer type?

使用猫,是否有better/more惯用的方法来做到这一点?

class Foo
class Bar extends Foo

val eithertBar = EitherT.apply(SomeMonad(Right[Whatever, Bar](new Bar)))
val eithertFoo = EitherT[SomeMonad, Whatever, Foo].apply(eithertBar.value)

提取值并重新应用感觉有点奇怪。谢谢

是的,对于任何仿函数 F Cats 提供了一个 widen 语法方法,可以满足您的要求。所以如果你有这个(为了举例,使用 Eval 作为 F):

class Foo
class Bar extends Foo

import cats.Eval, cats.data.EitherT, cats.syntax.functor._

val eithertBar = EitherT[Eval, String, Bar](Eval.now(Right(new Bar)))

你可以这么写:

scala> eithertBar.widen[Foo]
res0: cats.data.EitherT[cats.Eval,String,Foo] = EitherT(Now(Right(Bar@5ab3a323)))

请注意,如果 F 是标准库类型构造函数(例如 Option),或者其他类型构造函数中没有 Functor 实例对象,您必须确保导入或以其他方式为其提供 Functor 才能使其正常工作。