IO
немного похож на следующий сценарий
final case class SuspendedComputation[T](f: () => T) {
def run: T = f()
}
val v = SuspendedComputation(Random.nextInt)
v.run
v.run
, который выводит что-то вроде
v: SuspendedComputation[Int] = SuspendedComputation(<function>
res2: Int = -1062309211
res3: Int = 765640585
Обратите внимание, как SuspendedComputation
внутренне сохраняет вычисления как () => Random.nextInt
, а затемиспользует run
метод для фактической оценки вычислений f
.
Аналогично, IO.apply
принимает аргумент по имени : => A
и в конечном итоге создает Delay
объект, который сохраняет необработанные вычисления в поле как () => A
, а затем использует unsafeRunSync
для фактической оценки вычислений.