在scala猫效应中,你如何通过遍历将a展平以便于理解?
我有一些与此结构相同的代码,我不确定清理它的最佳方法是什么?简单的IOs和附加操作都在那里,因此示例编译时不需要额外的方法 我真的不想让它如此嵌套,有没有一种方法可以同时支持IO和List的单一理解?我知道这个问题的选项变体有选项,但似乎没有一个等价的列表 如有任何建议,将不胜感激在scala猫效应中,你如何通过遍历将a展平以便于理解?,scala,scala-cats,for-comprehension,cats-effect,Scala,Scala Cats,For Comprehension,Cats Effect,我有一些与此结构相同的代码,我不确定清理它的最佳方法是什么?简单的IOs和附加操作都在那里,因此示例编译时不需要额外的方法 我真的不想让它如此嵌套,有没有一种方法可以同时支持IO和List的单一理解?我知道这个问题的选项变体有选项,但似乎没有一个等价的列表 如有任何建议,将不胜感激 import cats.Traverse import cats.effect.IO import cats.implicits._ def exampleDoingSomeThings: IO[Unit] = f
import cats.Traverse
import cats.effect.IO
import cats.implicits._
def exampleDoingSomeThings: IO[Unit] = for {
ids <- IO.pure(List(1, 2, 3))
_ <- ids.traverse[IO, Unit](id => for {
users <- IO.pure(List(id + 4, id + 5, id + 6))
data <- IO(id + 7)
otherData <- IO(id + 8)
_ <- users.traverse[IO, Unit](ud => for {
innerData <- IO(id + ud)
innerState <- IO(ud + 9)
_ <- if (innerState > 15) for {
_ <- IO(println(s"action1: $id $ud"))
_ <- IO(println(s"action2: $id $ud"))
} yield () else IO.pure()
} yield ())
} yield ())
} yield ()
exampleDoingSomeThings.unsafeRunSync
导入猫。遍历
导入cats.effect.IO
进口猫_
def示例doingsomething:IO[Unit]=for{
ids正如其他人所提到的,您可以将方法提取为子方法。但是,如果您发现这还不够,您可以使用或之类的库来简化您的生活。这对于处理IO+列表非常有用
您可以将流可视化为一个项目列表,一个项目一个项目地发出。因此,您一次只需要处理一个项目
上述示例可以翻译为(不包括未使用的变量):
莫尼克斯:
def monixThings: Observable[Unit] = for {
id <- Observable.fromIterable(List(1, 2, 3))
ud <- Observable.fromIterable(List(id + 4, id + 5, id + 6))
innerState <- Observable.pure(ud + 9)
_ <- Observable.fromTask {
if (innerState > 15) {
for {
_ <- Task.delay(println(s"action1: $id $ud"))
_ <- Task.delay(println(s"action2: $id $ud"))
} yield ()
} else {
Task.unit
}
}
} yield ()
monixThings.completedL.runSyncUnsafe()
def monixThings:Observable[Unit]=for{
id如何从内部提取到更小的方法?这样你只能“看到”一个层次的嵌套。是的,这就是我最终要做的。有点失望,我不能让它读得更像一个扁平的理解。感谢到常见问题的链接!
import cats.effect.IO
import fs2.Stream
object FS2Example extends App {
def fs2Things = for {
id <- Stream.emits(List(1, 2, 3))
ud <- Stream.emits(List(id + 4, id + 5, id + 6))
innerState <- Stream.emit(ud + 9)
_ <- Stream.eval {
if (innerState > 15) {
for {
_ <- IO(println(s"action1: $id $ud"))
_ <- IO(println(s"action2: $id $ud"))
} yield ()
} else {
IO.unit
}
}
} yield ()
fs2Things.compile.drain.unsafeRunSync()
}