2

假设我有两个函数val f: A => M[B]val g: B => M[C]其中 M 是一元的。因此,我想通过使用 kleisli 将它们组合起来。我目前所做的是:kleisliU(f) andThenK g 但是我还没有找到一种方法来执行这种组合,而无需先手动包装到 kleisli 中。

怎么能写出这样的东西f <???> gf自动包装到kleisli中,然后再结合g?我希望 scalaz 中已经存在一些东西,并且我不需要编写自己的隐式类/转换。

只是为了完整起见,这也应该与更多功能一起使用,例如f <???> g <???> h.

4

1 回答 1

1

有一次我想要同样的东西,但在 scalaz 中没有找到,所以我自己写了:

implicit def toKleisliK[M[_], A, B]: (A => M[B]) => Kleisli[M, A, B] = f => { 
    kleisli[M, A, B](a => f(a)) 
}
// then for example you can write such:
val f: Int => Option[String] = ???
val g: String => Option[Double] = ???
val result = f andThenK g // inferred type is ReaderT[Option, Int, Double]
于 2016-09-05T12:36:03.667 回答