IO Monad 中未来的行为

Behaviour of a Future in an IO Monad

我写了一个函数,returns 一个 IO 值:

def foo(x : Int): IO[Future[Int]] = IO {
  // do some IO
  }

我正在使用 Scalaz 的 IO 类型类。

然后我用它来表达如下:

  (for {
    _ <- foo(10)
  } yield bar()).unsafePerformIO()

由于调用 foo 的结果是 Future,这个 Future 将在单独的线程中执行,而 yield 将立即调用 bar() , 或者 yield 会等到 Future 完成后再调用 bar()?

更新:

我运行下面的实验,看起来它并没有立即产生:

def foo() : IO[Future[Unit]] = IO { Future.successful(bar()) }

def bar() : Unit = {
  Thread.sleep(200000);
  println("done")
}

scala> (for {
     | _ <- foo()
     | } yield "bar").unsafePerformIO()
res3: String = bar

有没有办法异步处理那个未来?

IO { Future.successful(bar()) }

将执行 bar(),用 SuccessFailure 包装并将结果放入 IO.

另一方面

IO { Future { bar() } } // or IO { Future(bar()) }

将通过隐式 ExecutorContext.

将执行委托给单独的线程 bar()

Future(value: => T) 是一个异步调用,您正在寻找什么,而 Future.successful(value: => T) 是同步的,应该只用于立即 return 已经计算的值。