0

有2local种方法定义为:

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 的实例。如果可能的话,举个例子。无法得到它,这种方法可能有用。

4

2 回答 2

2

例如

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

于 2019-10-17T08:49:01.483 回答
2

我可以注意的是:Kleisli.local(f)(fa)与 相同fa.local(f),但它更冗长且严格来说没有那么强大(它需要参数和返回类型f相同,fa.local(f)而不是)。

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

于 2019-10-17T09:03:04.880 回答