检索包装在 IO 中的值

Retrieving value wrapped in IO

有没有办法在不使用 unsafeRunSync() 的情况下获取 IO 中的值?

例如,我有一个

val x : IO[Long] = IO25

我想获取 Long 值以便在不使用 unsafeRunSync()

的情况下对其执行一些计算

你不应该想要从 monadic context. This is incorrect way of thinking (retrieving the value from a context is typical for Comonad).

中获取值

Monads in pictures.

What is a monad?

您不应该希望从 Option[A] 获得 A,从 List[A] 获得 A,从 Future[A] 获得 AA 来自 IO[A]... 一旦你进入 monadic 计算,你应该继续在 monad 内部工作,使用 .map.flatMapfor-comprehensions 等.

例如val x: IO[Long] = ...里面

for {
  long <- x
  ...
} yield ...

long 的类型为 Long.

所以你在IO里面做计算,最后执行一次unsafeRunSync()unsafePerformIO()

因为 IO 形成一个 Functor 你可以映射它

IO(41L).map(_ + 1)

因为IO形成了一个Monad可以通过for-comprehension

for {
  a <- IO(1L)
  b <- IO(41L)
} yield a + b

请注意,IO 的语义并不真正意味着它是一种 容器 ,它包含我们可以从容器中取出的值。相反,它捕捉了将副作用与评估业务逻辑分开执行的想法。