scala - Kleisli 列表到 Kleisli 列表

标签 scala scala-cats kleisli

我想知道是否有办法转List[Kleisli[Option, Int, Int]]Kleisli[Option, Int, List[Int]] .

特别是我的 kleisli 列表是这样形成的:

def k(a: String) = Kleisli[Option, Int, Int](m => Some(a.length * m))
val kList = List("hi", "hello").map(k)

我做的是以下
Kleisli[Option, Int, List[Int]](m => kList.map(_.run(m)).sequence)

这是非常凌乱的,没有表现力,需要大量的手工工作。

有没有更好的办法?

最佳答案

是的,您可以使用 traverse这就是这样做的。如果您使用的是 cats <= 0.9.0 你可以使用以下代码:

import cats.data._
import cats.instances.list._
import cats.instances.option._
import cats.syntax.traverse._

// ...
def k(a: String) = Kleisli[Option, Int, Int](m => Some(a.length * m))
val result: Kleisli[Option, Int, List[Int] = List("hi", "hello").traverseU(k)

如果您使用的是 Scala 2.11.9+,请添加 scalacOptions += "-Ypartial-unification"给您的 build.sbt文件,你可以使用 traverse代替 traverseU .另外,从 1.0.0 版开始,traverseUsequenceU将不复存在。

请注意,如果您使用的是 Scala < 2.11.9 但 >= 2.10.6,您仍然可以通过添加 this plugin 来启用部分统一。到您的构建。

关于scala - Kleisli 列表到 Kleisli 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739449/

相关文章:

java - Scala 中的 Drools Expert 输出对象

scala - 使用 Monads Transformer 堆叠 Monad

scala - 如何使用 Kleisli 实现缓存

scala - 猫 Monad 变形金刚

scala - 堆叠 M、Either 和 Writer

Scala Kleisli 在 IntelliJ 中抛出错误

scala - 如何将 Scala Cats 的 Kleisli 与 Either 一起使用

scala - 在 scala 构造函数中定义局部变量

java - Java/Scala 的 ZeroMQ 回调

Scala 类型参数括号