在黄玉中,Kleisli[M[_], A, B]是A => M[B]的包装器,它允许合成这样的函数。例如,如果M[_]是monad,我可以用>=>编写Kleisli[M, A, B]和Kleisli[M, B, C]以获得Kleisli[M, A, C]。
简单地说,Kleisli提供了与M不同的高级andThens。是对的吗?使用Kleisli还有其他好处吗?
发布于 2015-03-14 18:10:02
这里有两个好处作为例子--我相信你会想到其他的。
首先,对不同的箭头(如Kleisli[M, ?, ?]和? => ? )进行抽象是很有用的。例如,我可以编写一个泛型函数,该函数将应用特定次数的自同态。
def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
List.fill(10)(Endomorphic(f)).suml现在我可以在例如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
}然后:
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, ?, ?]有一个单实例(如果F有),这一事实也可能是有用的。例如,请参阅我在这里的回答,演示如何在ReaderT中使用一元组合,这只是Kleisli的别名。
https://stackoverflow.com/questions/29049161
复制相似问题