使用固定折叠组合Kleisli

时间:2016-06-08 20:19:52

标签: scala functional-programming scalaz

我正在使用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下每个效果都堆积起来。

我尝试过像折叠这样的东西:

set.fold(Kleisli.???)((acc, a) => acc andThen f(a)) 

但我找不到合适的语法,特别是对于零Kleisli。

任何帮助将不胜感激!

编辑:澄清

1 个答案:

答案 0 :(得分:1)

您可以使用traverse

执行此操作
val result: Kleisli[IO, B, List[Unit]] = set.toList.traverse(f2)

我们需要从Set转到List因为没有Traverse[Set](类型类为我们提供traverse功能)。< / p>

如果您需要Kleisli[IO, B, Unit],可以执行result.void(类似于result.map(_ => ())