我正在使用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。
任何帮助将不胜感激!
编辑:澄清
答案 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(_ => ())
。