IO Monad中未来的行为

时间:2015-12-24 00:52:53

标签: scala scalaz

我编写了一个返回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(),或者产量会等到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

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

1 个答案:

答案 0 :(得分:1)

IO { Future.successful(bar()) }

将执行bar(),将其与SuccessFailure一起打包,并将结果放入IO

另一方面

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

将通过隐式bar()ExecutorContext执行委托给单独的线程。

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