7

In scalaz Kleisli[M[_], A, B]は のラッパーでありA => M[B]、そのような関数の合成を可能にします。たとえば、 if M[_]is モナドを構成Kleisli[M, A, B]してKleisli[M, B, C]with >=>to get を作成できますKleisli[M, A, C]

一言で言えば、に応じてKleisliファンシーを提供します。それが正しいか ?を使用する他の利点はありますか? andThensMKleisli

4

1 に答える 1

10

例として 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

于 2015-03-14T18:10:02.593 に答える