Scalaz Kleisli 使用优势
Scalaz Kleisli usage benefits
scalaz Kleisli[M[_], A, B]
是 A => M[B]
的包装器,它允许组合此类函数。例如,如果 M[_]
是 monad,我可以将 Kleisli[M, A, B]
和 Kleisli[M, B, C]
与 >=>
组合起来得到 Kleisli[M, A, C]
.
简而言之,Kleisli
提供花式 andThens
取决于 M
。这是对的吗 ?使用 Kleisli
还有其他好处吗?
这里有两个好处作为例子——我相信你能想出其他的。
首先,对不同的箭头进行抽象可能很有用,例如 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
有一个 monad 实例,这一事实也很有用。例如,请参阅 my answer here,了解如何使用 ReaderT
的单子组合的演示,这只是 Kleisli
.
的别名
scalaz Kleisli[M[_], A, B]
是 A => M[B]
的包装器,它允许组合此类函数。例如,如果 M[_]
是 monad,我可以将 Kleisli[M, A, B]
和 Kleisli[M, B, C]
与 >=>
组合起来得到 Kleisli[M, A, C]
.
简而言之,Kleisli
提供花式 andThens
取决于 M
。这是对的吗 ?使用 Kleisli
还有其他好处吗?
这里有两个好处作为例子——我相信你能想出其他的。
首先,对不同的箭头进行抽象可能很有用,例如 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
有一个 monad 实例,这一事实也很有用。例如,请参阅 my answer here,了解如何使用 ReaderT
的单子组合的演示,这只是 Kleisli
.