有没有办法在不使用unsafeRunSync()
的情况下获取IO
中的值?
例如,我有一个
val x : IO[Long] = IO$9125
我想获取 Long 值,以便在不使用unsafeRunSync()
的情况下对其执行一些计算
你不应该想要从一元上下文中获取值。这是不正确的思维方式(从上下文中检索值对于Comonad
来说是典型的(。
图片中的单子。
什么是单子?
你不应该想从Option[A]
、A
List[A]
、A
Future[A]
、A
IO[A]
那里得到A
......一旦你进入一元计算,你应该继续在一元内工作,包括.map
、.flatMap
、for
-理解等。
例如,对于内部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
语义并不意味着它是一种容器,它保存着我们可以从容器中取出的值。相反,它捕获了执行副作用的想法,将其与评估业务逻辑分开。