我正在使用Scala2.11和Scalaz 7.2.3 (最新版本)。
我很难把克莱斯里结合起来。我有两个职能:
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(_))但我更想找的是克莱斯里的组合。事实上,我的类型应该保持Kleisliscalaz.effect.IO,B,Unit,在相同的IO下,每个效应堆积起来。
例如,我尝试了诸如折叠之类的东西:
set.fold(Kleisli.???)((acc, a) => acc andThen f(a)) 但是我找不到正确的语法,特别是对于零Kleisli。
任何帮助都将不胜感激!
编辑:澄清
发布于 2016-06-08 21:25:23
您可以使用traverse来完成这个任务:
val result: Kleisli[IO, B, List[Unit]] = set.toList.traverse(f2)我们需要从Set转到List,因为不存在Traverse[Set] (提供traverse函数的类型类)。
如果您想要Kleisli[IO, B, Unit],可以执行result.void (这类似于result.map(_ => ()) )。
https://stackoverflow.com/questions/37712152
复制相似问题