Ecco due vantaggi come esempi: sono sicuro che potresti venire con gli altri.
In primo luogo, può essere utile astrarre su diverse frecce, come ad esempio Kleisli[M, ?, ?]
e ? => ?
. Ad esempio, posso scrivere una funzione generica che applicherà un endomorfismo un certo numero di volte.
def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
List.fill(10)(Endomorphic(f)).suml
Ora posso utilizzare questo ad es. Int => Int
o 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
}
E poi: (. Si noti che A =?> B
è solo un alias per Kleisli[Option, A, B]
)
scala> applyX10(f).run(1)
res0: Int = 11
scala> applyX10[=?>, Int](k).run(2)
res1: Option[Int] = Some(118098)
In secondo luogo, il fatto che Kleisli[F, ?, ?]
ha un'istanza monade se F
fa può anche essere utile. Vedere ad esempio my answer here per una dimostrazione di come è possibile utilizzare la composizione monadica con ReaderT
, che è solo un alias per Kleisli
.
fonte
2015-03-14 18:10:02
Grazie. Proverò a _grok_ it come segue: (1) 'Kleisli' in generale come un'astrazione su frecce diverse (2) casi speciali: ad es. 'ReaderT', reader monad, ecc. – Michael
Bene, per una monade' M', 'Kleisli [M,?,?]' È _an_ arrow. –
Capito. Grazie, – Michael