检索包装在 IO 中的值



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

例如,我有一个

val x : IO[Long] = IO$9125

我想获取 Long 值,以便在不使用unsafeRunSync()的情况下对其执行一些计算

你不应该想要从一元上下文中获取值。这是不正确的思维方式(从上下文中检索值对于Comonad来说是典型的(。

图片中的单子。

什么是单子?

你不应该想从Option[A]AList[A]AFuture[A]AIO[A]那里得到A......一旦你进入一元计算,你应该继续在一元内工作,包括.map.flatMapfor-理解等。

例如,对于内部val x: IO[Long] = ...

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

long具有类型Long

因此,您可以在IO内部进行计算,并在最后执行unsafeRunSync()unsafePerformIO()一次。

因为IO形成了一个Functor所以你可以在它上面映射

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

因为IO形成了一个Monad所以你可以把它通过

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

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

最新更新