无法编写猫 Reader Monad
Not able to compose the Cats Reader Monad
我写了下面的代码
case class Foo(i: Int, j:Int)
def do1() : Reader[Foo, String] = Reader(f => s"doing ${f.i}")
def do2() : Reader[Foo, String] = Reader(f => s"doing ${f.j}")
现在,如果我尝试将它们组合成另一个函数
def func() : Reader[Foo, List[String]] = Reader(f =>
for {
m1 <- do1()
m2 <- do2()
} yield List(m1, m2)
}
我希望的是我会做 func().run(Foo(10, 20))
这会给我一个 List("doing 10", "doing 20")
但是我得到一个编译器错误
type mismatch;
found : cats.data.Kleisli[cats.Id,$sess.cmd1.Foo,List[String]]
required: List[String]
m1 <- do1()
^
Compilation Failed
如果您查看 Cats 库中 Reader 的定义,您会发现 Reader 只是 Kleisli 的类型别名:
type ReaderT[F[_], A, B] = Kleisli[F, A, B]
val ReaderT = Kleisli
type Reader[A, B] = ReaderT[Id, A, B]
因此您的 for 理解评估为:
Kleisli[Id, Foo, List[String]]
与Reader同类型!只需删除将您的理解包裹在 reader 中,它就可以工作:
def func(): Reader[Foo, List[String]] = {
for {
m1 <- do1()
m2 <- do2()
} yield List(m1, m2)
}
我写了下面的代码
case class Foo(i: Int, j:Int)
def do1() : Reader[Foo, String] = Reader(f => s"doing ${f.i}")
def do2() : Reader[Foo, String] = Reader(f => s"doing ${f.j}")
现在,如果我尝试将它们组合成另一个函数
def func() : Reader[Foo, List[String]] = Reader(f =>
for {
m1 <- do1()
m2 <- do2()
} yield List(m1, m2)
}
我希望的是我会做 func().run(Foo(10, 20))
这会给我一个 List("doing 10", "doing 20")
但是我得到一个编译器错误
type mismatch;
found : cats.data.Kleisli[cats.Id,$sess.cmd1.Foo,List[String]]
required: List[String]
m1 <- do1()
^
Compilation Failed
如果您查看 Cats 库中 Reader 的定义,您会发现 Reader 只是 Kleisli 的类型别名:
type ReaderT[F[_], A, B] = Kleisli[F, A, B]
val ReaderT = Kleisli
type Reader[A, B] = ReaderT[Id, A, B]
因此您的 for 理解评估为:
Kleisli[Id, Foo, List[String]]
与Reader同类型!只需删除将您的理解包裹在 reader 中,它就可以工作:
def func(): Reader[Foo, List[String]] = {
for {
m1 <- do1()
m2 <- do2()
} yield List(m1, m2)
}