Scalaz-Kleisli使用优势

Scalaz-Kleisli使用优势,scala,scalaz,kleisli,Scala,Scalaz,Kleisli,在Kleisli[M[_]中,A,B]是A=>M[B]的包装器,它允许组合此类函数。例如,如果M[\u]是单子,我可以将Kleisli[M,A,B]和Kleisli[M,B,C]与=>组合,得到Kleisli[M,A,C] 简而言之,Kleisli提供了奇特的,然后取决于M。对吗?使用Kleisli还有其他好处吗 这里有两个好处作为例子——我相信你可以想出其他好处 首先,在不同的箭头上进行抽象是有用的,例如Kleisli[M,,?]和?=>。例如,我可以编写一个泛型函数,它将应用自同态一定次数

Kleisli[M[_]中,A,B]
A=>M[B]
的包装器,它允许组合此类函数。例如,如果
M[\u]
是单子,我可以将
Kleisli[M,A,B]
Kleisli[M,B,C]
=>
组合,得到
Kleisli[M,A,C]


简而言之,
Kleisli
提供了奇特的
,然后
取决于
M
。对吗?使用
Kleisli
还有其他好处吗

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

首先,在不同的箭头上进行抽象是有用的,例如
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
有一个monad实例,这一事实也很有用。例如,请参见演示如何将一元合成与
ReaderT
一起使用,这只是
Kleisli
的别名,谢谢。我将尝试如下探索:(1)
Kleisli
通常作为对不同箭头的抽象(2)特殊情况:例如
ReaderT
、reader monad等。对于monad
M
Kleisli[M,,,?]
是一个箭头。