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等。对于monadM
,Kleisli[M,,,?]
是一个箭头。