0

異なる ReaderT を返すs3f1および関数の例:s3f2

type FailFast[A] = Either[List[String], A]
trait Service1 { def s1f:Option[Int] = Some(10) }
trait Service2 { def s2f:FailFast[Int] = Right(20) }

import cats.instances.option._

def s3f1: ReaderT[Option, Service1, Int] =
  for {
    r1 <- ReaderT((_: Service1).s1f)
  } yield r1 + 1

import cats.syntax.applicative._
import cats.instances.either._

type ReaderService2FF[A] = ReaderT[FailFast, Service2, A]

def s3f2: ReaderService2FF[Int] =
  for {
    r1 <- ReaderT((_: Service2).s2f)
    r2 <- 2.pure[ReaderService2FF]
  } yield r1 + r2

F[_]コンテキストと依存関係が異なるリーダーを返す次の 2 つの関数を構成しようとしていReaderT[Option, Service1, Int]ます。ReaderT[FailFast, Service2, Int]

どういうわけかF[_]コンテキストを結合する必要があります。つまり、 と結合FailFastOptionます。私は、それを次のように組み合わせるのが理にかなっていると思いますFailFast[Option]

type Env = (Service1, Service2)
type FFOption[A] = FailFast[Option[A]]
type ReaderEnvFF[A] = ReaderT[FFOption, Env, A]

s3f1 と s3f2 の構成方法:

def c: ReaderEnvFF[Int] =
  for {
    r1 <- //s3f1
    r2 <- //s3f2
  } yield r1 + r2
4

1 に答える 1