Scalaz Kleisli的使用益处

Mic*_*ael 7 scala scalaz kleisli

scalaz中 Kleisli[M[_], A, B]是一个包装器A => M[B],它允许组合这些功能.举例来说,如果M[_]是我单子可以撰写Kleisli[M, A, B],并Kleisli[M, B, C]>=>得到Kleisli[M, A, C].

简而言之,取决于Kleisli提供花式.这是对的吗 ?使用还有其他好处吗? andThensMKleisli

Tra*_*own 10

这有两个好处作为例子 - 我相信你可以拿出其他人.

首先,抽象不同的箭头可能很有用,例如Kleisli[M, ?, ?]? => ?.例如,我可以编写一个通用函数,它将内部结构应用一定次数.

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

现在我可以在例如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
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

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

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

其次,Kleisli[F, ?, ?]具有monad实例的事实F也是有用的.例如,请参阅我的答案,以演示如何使用monadic组合ReaderT,这只是一个别名Kleisli.