【问题标题】:Combining Kleisli using a set fold使用固定折叠组合 Kleisli
【发布时间】:2016-06-08 20:19:52
【问题描述】:

我正在使用 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。

任何帮助将不胜感激!

编辑:澄清

【问题讨论】:

  • 你的问题不是很清楚。您想为 Set[A] 的所有元素执行 f2 吗? elements 与第一部分有什么关系?
  • 对不起,我会尽量详细说明。是的,需要对 Set[A] 的每个元素执行 f。

标签: scala functional-programming scalaz


【解决方案1】:

您可以使用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(_ => ())

【讨论】:

  • 太棒了!今天学了点儿新东西 !我不完全是我应该在的地方,但是这个遍历功能会很棒=)
  • 你也可以直接使用set.toList.traverse_(f2)Kleisli[IO, B, Unit]
  • 好吧,即使 Unit 和 List[Unit] 相同,我也会使用它。我想我最初的问题是我无法准确表达我想要的内容,即:在一个 IO 操作中包装此列表中此函数的排序,使用此 B 作为参数并且不返回任何内容。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多