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()
,用 Success
或 Failure
包装并将结果放入 IO
.
另一方面
IO { Future { bar() } } // or IO { Future(bar()) }
将通过隐式 ExecutorContext
.
将执行委托给单独的线程 bar()
Future(value: => T)
是一个异步调用,您正在寻找什么,而 Future.successful(value: => T)
是同步的,应该只用于立即 return 已经计算的值。
我写了一个函数,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()
,用 Success
或 Failure
包装并将结果放入 IO
.
另一方面
IO { Future { bar() } } // or IO { Future(bar()) }
将通过隐式 ExecutorContext
.
bar()
Future(value: => T)
是一个异步调用,您正在寻找什么,而 Future.successful(value: => T)
是同步的,应该只用于立即 return 已经计算的值。