我想知道是否有办法转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 版开始,traverseU
和 sequenceU
将不复存在。请注意,如果您使用的是 Scala < 2.11.9 但 >= 2.10.6,您仍然可以通过添加 this plugin 来启用部分统一。到您的构建。
关于scala - Kleisli 列表到 Kleisli 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739449/