【问题标题】:Difference between parSequence and starting fibers manuallyparSequence 和手动启动纤维之间的区别
【发布时间】:2022-01-25 02:02:57
【问题描述】:

我有两个程序的实现

def program_valid: IO[Unit] = for {
    interpreter <- Interpreter[IO]
    fib1 <- display(interpreter).start
    fib2 <- read(interpreter).start
    _ <- fib1.join
    _ <- fib2.join
  } yield ()

  def program_invalid: IO[Unit] = for {
    interpreter <- Interpreter[IO]
    _ <- (read(interpreter), display(interpreter)).parSequence
  } yield ()

第一个运行良好,这意味着两条光纤都在运行(显示和读取)。不幸的是,第二次实施的工作方式不同。看起来只有显示光纤会运行。为什么会这样?这里有什么区别?

【问题讨论】:

    标签: scala functional-programming scala-cats


    【解决方案1】:

    parSequence 用于集合(实际上是用于具有Traverse 实例的类型),甚至不确定它是如何编译的;好吧,我的意思是 Tuple2 可能有一个 Traverse 实例,但它绝对不能满足您的要求。

    你可以使用:

    _ <- (read(interpreter), display(interpreter)).parTupled.void
    // Or
    _ <- IO.both(read(interpreter), display(interpreter)).void
    // Or
    _ <- read(interpreter).both(display(interpreter)).void
    // Or
    _ <- List(read(interpreter), display(interpreter)).parSequence_
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2011-09-02
      相关资源
      最近更新 更多