Scalaz Kleisli преимущества использования
В скалазе Kleisli[M[_], A, B]
это обертка A => M[B]
, что позволяет составление таких функций. Например, если M[_]
монада я могу сочинять Kleisli[M, A, B]
а также Kleisli[M, B, C]
с >=>
получить Kleisli[M, A, C]
,
В двух словах, Kleisli
обеспечивает фантазии andThens
в зависимости от M
, Это правильно? Есть ли другие преимущества использования Kleisli
?
1 ответ
Вот два преимущества в качестве примеров - я уверен, что вы могли бы придумать другие.
Во-первых, может быть полезно абстрагироваться от разных стрелок, таких как 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
может также быть полезным. Смотрите, например, мой ответ здесь для демонстрации того, как вы можете использовать монадическую композицию с ReaderT
, который является просто псевдонимом для Kleisli
,