7

scalaz Kleisli[M[_], A, B]中是 的包装器A => M[B],它允许组合这些函数。例如,如果M[_]是 monad,我可以 composeKleisli[M, A, B]Kleisli[M, B, C]with >=>to get Kleisli[M, A, C]

简而言之,Kleisli根据andThens. M这是对的吗 ?使用还有其他好处Kleisli吗?

4

1 回答 1

10

这里有两个好处作为例子——我相信你可以想出其他的。

首先,对不同的箭头进行抽象可能很有用,例如Kleisli[M, ?, ?]? => ?。例如,我可以编写一个通用函数,该函数将应用自同态一定次数。

def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
  List.fill(10)(Endomorphic(f)).suml

现在我可以在例如Int => IntKleisli[Option, Int, Int]

val f = (_: Int) + 1

val k = Kleisli.kleisli[Option, Int, Int] {
  case i if i % 2 == 0 => Some(i * 3)
  case _ => None
}

接着:

scala> applyX10(f).run(1)
res0: Int = 11

scala> applyX10[=?>, Int](k).run(2)
res1: Option[Int] = Some(118098)

(请注意,这A =?> B只是 . 的别名Kleisli[Option, A, B]。)

其次,Kleisli[F, ?, ?]具有 monad 实例 if Fdoes 的事实也很有用。例如,请参阅我的回答,了解如何使用 monadic 组合ReaderT,这只是Kleisli.

于 2015-03-14T18:10:02.593 回答