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,

Другие вопросы по тегам