前述のとおり、 Nondeterminism
を使用してください。たとえば、次のようにwaitALongTime
の最初の副作用が起こるだろう除き、すべての場合には
pairFailSlow(divByZero, waitALongTime).run // fails immediately
pairFailSlow(waitALongTime, divByZero).run // hangs while sleeping
pairFailFast(divByZero, waitALongTime).run // fails immediately
pairFailFast(waitALongTime, divByZero).run // fails immediately
:
import scalaz._, scalaz.Scalaz._, scalaz.concurrent._
def pairFailSlow[A, B](a: Task[A], b: Task[B]): Task[(A, B)] = a.tuple(b)
def pairFailFast[A, B](a: Task[A], b: Task[B]): Task[(A, B)] =
Nondeterminism[Task].both(a, b)
val divByZero: Task[Int] = Task(1/0)
val waitALongTime: Task[String] = Task {
Thread.sleep(10000)
println("foo")
"foo"
}
そして。その計算を停止したい場合は、Task
のrunAsyncInterruptibly
のようなものを使用する必要があります。
ここでは_cancel_という意味のものがいくつかあります。計算が失敗するだけですか?そして、非決定論の上に 'both'のようなものが働きます。サイクルを無駄にしないようにしたい場合(またはまだ実行中の計算の効果を取り消したい場合)、より複雑になります。 –
はい、今は計算を高速で失敗させたいだけです。 – Michael