使用 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)

我们需要从 SetList 因为不存在 Traverse[Set] (类型 class 给了我们 traverse功能)。

如果你想要Kleisli[IO, B, Unit]你可以做result.void(类似于result.map(_ => ())