如何向上转换单子变压器类型



使用猫,有没有更好/更惯用的方法呢?

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才能使其正常工作。

最新更新