Scala-cats:阅读器组合

标签 scala scala-cats for-comprehension reader-monad

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

错误:

Error:(26, 11) type mismatch; found : T1.this.Env => com.savdev.Cats (which expands to) ((com.savdev.Service1, com.savdev.Service2, com.savdev.Cats)) => com.savdev.Cats required: com.savdev.Cats } yield cats

你能解释一下,为什么 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)
...

最佳答案

toReaderEnvFF((_: Env)._3)cats <- toReaderEnvFF((_: Env)._3)实际上是toReaderEnvFF[A]((_: Env)._3)对于某些类型 A .什么是 A现在?自 (_: Env)._3 (又名 inputtoReaderEnvFF )是类型 Env => Cats然后输入 AEnv => Cats .所以toReaderEnvFF((_: Env)._3)类型为 ReaderEnvFF[Env => Cats]catscats <- toReaderEnvFF((_: Env)._3)类型为 Env => Cats .

x <- SomeMonad[T]变量 x类型为 T (现在 SomeMonadReaderEnvFFTEnv => Cats )。

ReaderT((_: Service1).s1f)在你的第二个例子中是 ReaderT[Option, Service1, Int] 类型所以r2r2 <- ReaderT((_: Service1).s1f)类型为 Int .但在你的第一个例子中 toReaderEnvFF((_: Env)._3)类型为 ReaderEnvFF[Env => Cats]又名 ReaderT[FailFast, Env, Env => Cats]所以catscats <- toReaderEnvFF((_: Env)._3)类型为 Env => Cats .这就是区别。

如果您想使用 ReaderEnvFF[Cats]那么你应该改变cats <- toReaderEnvFF(???) .例如

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

关于Scala-cats:阅读器组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55567501/

相关文章:

scala - 如何使用 Proguard 和 SBT 混淆 Fat Scala Jar

scala - 类型构造函数参数推断

scala - Scala 中无法解释的理解结果

带有类型注释的 for-comprehension 中的 scala 异常

scala - 赋值循环的 for 理解顺序错误

scala - 如何旋转 Spark 数据框表?

scala - 理解 Scala 中的随机 monad

scala - 如何为 cats Free Monad 中使用的 ADT 创建仿函数

Scala Cats 将值提升到 Monad Transformers 中

java - 无法将新生成的 Play Framework 项目导入 IntelliJ IDEA 15