使用 scalaz kleisli 之前没有显式包装函数
Using scalaz kleisli without explicit wrapping the function before
假设我有两个函数 val f: A => M[B]
和 val g: B => M[C]
,其中 M 是一元函数。因此我想使用 kleisli 将它们组合起来。
我目前做的是:kleisliU(f) andThenK g
但是我还没有找到一种方法来执行这个组合而不先手动包装到 kleisli 中。
如何写出类似f <???> g
这样的东西,以便f
自动包装到kleisli中,然后与g
结合?我希望 scalaz 中已经存在一些东西,并且我不需要编写自己的隐式 class / 转换。
为了完整起见,这也应该适用于更多功能,例如f <???> g <???> h
.
有一次我想要同样的东西,在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]
假设我有两个函数 val f: A => M[B]
和 val g: B => M[C]
,其中 M 是一元函数。因此我想使用 kleisli 将它们组合起来。
我目前做的是:kleisliU(f) andThenK g
但是我还没有找到一种方法来执行这个组合而不先手动包装到 kleisli 中。
如何写出类似f <???> g
这样的东西,以便f
自动包装到kleisli中,然后与g
结合?我希望 scalaz 中已经存在一些东西,并且我不需要编写自己的隐式 class / 转换。
为了完整起见,这也应该适用于更多功能,例如f <???> g <???> h
.
有一次我想要同样的东西,在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]