斯卡拉猫:读者构成


import cats.data.ReaderT
import cats.instances.either._
trait Service1
trait Service2
case class Cats(name:String)
type FailFast[A] = Either[List[String], A]
type Env = (Service1, Service2, Cats)
type ReaderEnvFF[A] = ReaderT[FailFast, Env, A]
def toReaderEnvFF[A](input:A):ReaderEnvFF[A] =
  ReaderT((_:Env) => Right(input))
def c:ReaderEnvFF[Cats] =
  for {
    cats <- toReaderEnvFF((_:Env)._3)
  } yield cats   // This line is 26

错误:

错误:(26, 11( 类型不匹配; 发现 : T1.this.Env => com.savdev.cats (扩展到( ((com.savdev.Service1, com.savdev.Service2, com.savdev.Cats(( => com.savdev.Cats required: com.savdev.Cats } 产量猫

你能解释一下,为什么猫不com.savdev.Cats吗?以及为什么在错误中,它说它被扩展为具有返回方法的函数 [Cats] ,机器人不FailFast[Cats]

我尝试应用与此处完全相同的逻辑:

trait Service1 { def s1f = Option(10) }
trait Service2 {
  type ReaderS1[A] = ReaderT[Option,Service1,A]
  import cats.syntax.applicative._
  import cats.instances.option._
  def s2f:ReaderS1[Int] =
    for {
      r2 <- ReaderT((_: Service1).s1f)
      r1 <- 1.pure[ReaderS1]
    } yield r1 + r2
}

在这个例子中,我可以将函数 Service1.s1f 转换为它的结果 r2,它工作正常。为什么我不能,例如写这样的东西:

for {
 cats <- ReaderT((_:Env)._3)
...

cats <- toReaderEnvFF((_: Env)._3)中的toReaderEnvFF((_: Env)._3)实际上对某些类型的A toReaderEnvFF[A]((_: Env)._3)。现在A是什么?由于(_: Env)._3(又名input toReaderEnvFF(属于Env => Cats类型,因此类型AEnv => Cats。所以toReaderEnvFF((_: Env)._3)ReaderEnvFF[Env => Cats]型,cats cats <- toReaderEnvFF((_: Env)._3)Env => Cats型。

x <- SomeMonad[T]变量中,变量x的类型是T(现在SomeMonadReaderEnvFFTEnv => Cats(。

第二个示例中的ReaderT((_: Service1).s1f)属于 ReaderT[Option, Service1, Int] 类型,因此r2 <- ReaderT((_: Service1).s1f)中的r2属于 Int 类型。但是在您的第一个示例中,toReaderEnvFF((_: Env)._3)属于 ReaderEnvFF[Env => Cats] 类型又名 ReaderT[FailFast, Env, Env => Cats],因此cats <- toReaderEnvFF((_: Env)._3)中的catsEnv => Cats 类型。这就是区别。

如果你想和ReaderEnvFF[Cats]一起工作,那么你应该改变cats <- toReaderEnvFF(???)。例如

def c:ReaderEnvFF[Cats] =
  for {
    cats <- toReaderEnvFF(Cats("aaa"))
  } yield cats 

相关内容

  • 没有找到相关文章

最新更新