无法组成Cats Reader Monad

时间:2017-03-25 23:59:09

标签: scala scala-cats

我写了以下代码

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)),这会给我一份清单(&#34;做10&#34;,&#34;做20&#34;)

但我收到编译错误

type mismatch;
 found   : cats.data.Kleisli[cats.Id,$sess.cmd1.Foo,List[String]]
 required: List[String]
m1 <- do1()
   ^
Compilation Failed

1 个答案:

答案 0 :(得分:5)

如果你看一下Reader在Cats库中的定义,你会发现Reader只是Kleisli的一个类型别名:

type ReaderT[F[_], A, B] = Kleisli[F, A, B]
val ReaderT = Kleisli

type Reader[A, B] = ReaderT[Id, A, B]

所以你的理解评估为:

Kleisli[Id, Foo, List[String]]

与Reader的类型相同!只需删除将您的理解包装在阅读器中就可以了:

def func(): Reader[Foo, List[String]] = {
    for {
      m1 <- do1()
      m2 <- do2()
    } yield List(m1, m2)
}