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 => Int或Kleisli[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.