Как создать Kleisli с Kleisli.local (не локально для преобразования) - PullRequest
0 голосов
/ 17 октября 2019

Существует 2 local метода, определенного как:

final case class Kleisli[F[_], A, B](run: A => F[B]) { self =>
  ...
  def local[AA](f: AA => A): Kleisli[F, AA, B] =
    Kleisli(f.andThen(run))
  ...
}

и как:

sealed private[data] trait KleisliFunctions {
  ...
  def local[M[_], A, R](f: R => R)(fa: Kleisli[M, R, A]): Kleisli[M, R, A] =
    Kleisli(f.andThen(fa.run))
}

Второй метод должен использоваться как фабричный метод для построения Клейсли.

Можете ли вы предложить какие-либо варианты использования второго метода, определенного в KleisliFunctions, для создания экземпляра Kleisli. С примером, если это возможно. Не могу получить его, где этот метод может быть полезен.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Что я могу отметить: Kleisli.local(f)(fa) - это то же самое, что и fa.local(f), но оно более многословно и строго менее мощно (для него требуется, чтобы аргумент и тип возвращаемого значения f были одинаковыми, fa.local(f) не делает 'т).

Потенциальная причина его использования может быть связана с выводом типа fa, в этом случае Kleisli.local предоставляет ожидаемый тип, а fa.local - нет.

2 голосов
/ 17 октября 2019

Например

val k: Kleisli[Option, String, Char] = Kleisli(_.headOption)

k.local[Int](_.toString): Kleisli[Option, Int, Char]  // Kleisli#local

Kleisli.local((_: String).toUpperCase)(k): Kleisli[Option, String, Char] // KleisliFunctions#local

Объект Kleisli расширяет черту KleisliFunctions.

...