例として 2 つのメリットを挙げます。他のメリットも考えられると思います。
Kleisli[M, ?, ?]まず、やなどのさまざまな矢印を抽象化すると便利です? => ?。たとえば、自己同型写像を特定の回数適用する汎用関数を作成できます。
def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
List.fill(10)(Endomorphic(f)).suml
これで、egInt => 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も役に立ちます。たとえば、 の単なるエイリアスである でモナド合成を使用する方法のデモンストレーションについては、私の回答 hereを参照してください。ReaderTKleisli