使用 set fold 组合 Kleisli
Combining Kleisli using a set fold
我正在使用 scala 2.11 和 Scalaz 7.2.3(最新)。
我在组合 Kleisli 时遇到了麻烦。我有两个功能:
type A = ...
type B = ...
def set: Set[A]
def f: A => Kleisli[scalaz.effect.IO, B, Unit]
val result: Set[Kleisli[scalaz.effect.IO, B, Unit]] = set.map(f(_))
但我正在寻找更多作为 Kleisli 组合的结果。其实我的类型应该是Kleisli[scalaz.effect.IO, B, Unit],在同一个IO下各个effect pile up.
我试过折叠之类的东西,例如:
set.fold(Kleisli.???)((acc, a) => acc andThen f(a))
但我找不到正确的语法,尤其是零 Kleisli。
如有任何帮助,我们将不胜感激!
编辑:澄清
您可以使用 traverse
执行此操作:
val result: Kleisli[IO, B, List[Unit]] = set.toList.traverse(f2)
我们需要从 Set
到 List
因为不存在 Traverse[Set]
(类型 class 给了我们 traverse
功能)。
如果你想要Kleisli[IO, B, Unit]
你可以做result.void
(类似于result.map(_ => ())
。
我正在使用 scala 2.11 和 Scalaz 7.2.3(最新)。
我在组合 Kleisli 时遇到了麻烦。我有两个功能:
type A = ...
type B = ...
def set: Set[A]
def f: A => Kleisli[scalaz.effect.IO, B, Unit]
val result: Set[Kleisli[scalaz.effect.IO, B, Unit]] = set.map(f(_))
但我正在寻找更多作为 Kleisli 组合的结果。其实我的类型应该是Kleisli[scalaz.effect.IO, B, Unit],在同一个IO下各个effect pile up.
我试过折叠之类的东西,例如:
set.fold(Kleisli.???)((acc, a) => acc andThen f(a))
但我找不到正确的语法,尤其是零 Kleisli。
如有任何帮助,我们将不胜感激!
编辑:澄清
您可以使用 traverse
执行此操作:
val result: Kleisli[IO, B, List[Unit]] = set.toList.traverse(f2)
我们需要从 Set
到 List
因为不存在 Traverse[Set]
(类型 class 给了我们 traverse
功能)。
如果你想要Kleisli[IO, B, Unit]
你可以做result.void
(类似于result.map(_ => ())
。