问题描述
在 scalaz Kleisli[M[_], A, B]
是A =>M[B],允许组合这些函数.例如,如果 M[_]
是 monad 我可以组合 Kleisli[M, A, B]
和 Kleisli[M, B, C]
用 >=>
得到 Kleisli[M, A, C]
.
In scalaz Kleisli[M[_], A, B]
is a wrapper of A => M[B]
, which allows composition of such functions. For instance, if M[_]
is monad I can compose Kleisli[M, A, B]
and Kleisli[M, B, C]
with >=>
to get Kleisli[M, A, C]
.
简而言之,Kleisli
根据 M
提供花哨的 andThens
.这是正确的吗 ?使用 Kleisli
还有其他好处吗?
In a nutshell, Kleisli
provides fancy andThens
depending on M
. Is it correct ? Are there other benefits of using Kleisli
?
推荐答案
这里有两个好处作为例子——我相信你可以想出其他的.
Here are two benefits as examples—I'm sure you could come up with others.
首先,抽象不同的箭头会很有用,例如 Kleisli[M, ?, ?]
和 ?=>?
.例如,我可以编写一个泛型函数,该函数将应用一定次数的内同态.
First, it can be useful to abstract over different arrows, such as Kleisli[M, ?, ?]
and ? => ?
. For example, I can write a generic function that will apply an endomorphism a certain number of times.
def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
List.fill(10)(Endomorphic(f)).suml
现在我可以在例如Int =>Int
或 Kleisli[Option, Int, Int]
:
Now I can use this on e.g. Int => Int
or 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]
的别名.)
(Note that A =?> B
is just an alias for Kleisli[Option, A, B]
.)
第二,Kleisli[F, ?, ?]
有一个 monad 实例(如果 F
有)的事实也很有用.例如,请参阅我在此处的回答,以演示如何将 monadic 组合与 ReaderT
结合使用,这只是 Kleisli
的别名.
Second, the fact that Kleisli[F, ?, ?]
has a monad instance if F
does can also be useful. See for example my answer here for a demonstration of how you can use monadic composition with ReaderT
, which is just an alias for Kleisli
.
这篇关于Scalaz Kleisli 使用优势的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!