繁体   English   中英

如何转换monad变压器类型?

[英]How to upcast a monad transformer type?

使用Cats,有没有更好/更惯用的方式来做到这一点?

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语法方法, 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为了使它起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM