如何使用 Kleisli.local 创建 Kleisli(不是本地转换)

How to create Kleisli with Kleisli.local (not local for transforming)

有 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))
}

第二个应该作为工厂方法,构造Kleisli。

能否请您提供任何用例以使用 KleisliFunctions 中定义的第二种方法来创建 Kleisli 实例。如果可能的话,举个例子。拿不到,这个方法哪里有用。

例如

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.

我能注意到的是:Kleisli.local(f)(fa)fa.local(f) 相同,但它更冗长且严格来说功能更弱(它需要参数和 return 类型的 f 相同,fa.local(f) 则不同)。

使用它的一个潜在原因是如果需要推断 fa 的类型,在这种情况下 Kleisli.local 提供预期的类型而 fa.local 不提供。