如何使用 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
不提供。
有 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
不提供。