如何改变monad变压器类型?

时间:2017-04-09 18:39:08

标签: scala monad-transformers scala-cats

使用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)

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

1 个答案:

答案 0 :(得分:4)

是的,对于任何仿函数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才能使其生效。