繁体   English   中英

无法撰写Cats 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]

因此,您的理解力评估为:

Kleisli[Id, Foo, List[String]]

与Reader的类型相同! 只需删除将您的理解包装在阅读器中,它就会起作用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM