Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala猫效应中,你如何通过遍历将a展平以便于理解?_Scala_Scala Cats_For Comprehension_Cats Effect - Fatal编程技术网

在scala猫效应中,你如何通过遍历将a展平以便于理解?

在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

我有一些与此结构相同的代码,我不确定清理它的最佳方法是什么?简单的IOs和附加操作都在那里,因此示例编译时不需要额外的方法

我真的不想让它如此嵌套,有没有一种方法可以同时支持IO和List的单一理解?我知道这个问题的选项变体有选项,但似乎没有一个等价的列表

如有任何建议,将不胜感激

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()
}