2017-04-09 3 views
2

猫を使って、これを行うにはより良い/より慣用的な方法がありますか?モナドトランスタイプをアップキャストするには?

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) 

値を抽出して再適用すると、少し奇妙に感じられます。ありがとう。

答えて

4

はい、任意のファンクタについてF Catsは、要求していることを行うことができるwiden構文メソッドを提供します。あなたは、この(例のためFとしてEvalを使用して)持っているのであれば:Fは、標準ライブラリの型コンストラクタ(ようなものであった場合のことを

scala> eithertBar.widen[Foo] 
res0: cats.data.EitherT[cats.Eval,String,Foo] = EitherT(Now(Right([email protected]))) 

注:

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

をあなたはこれを書くことができますOptionなど)、またはコンパニオンオブジェクトにFunctorインスタンスを持たない他のタイプのコンストラクタをインポートする場合は、これをインポートするか、そうでなければFunctorを提供する必要があります。

関連する問題