检索包装在 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
).
中获取值
What is a monad?
您不应该希望从 Option[A]
获得 A
,从 List[A]
获得 A
,从 Future[A]
获得 A
,A
来自 IO[A]
... 一旦你进入 monadic 计算,你应该继续在 monad 内部工作,使用 .map
、.flatMap
、for
-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
的语义并不真正意味着它是一种 容器 ,它包含我们可以从容器中取出的值。相反,它捕捉了将副作用与评估业务逻辑分开执行的想法。
有没有办法在不使用 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
).
What is a monad?
您不应该希望从 Option[A]
获得 A
,从 List[A]
获得 A
,从 Future[A]
获得 A
,A
来自 IO[A]
... 一旦你进入 monadic 计算,你应该继续在 monad 内部工作,使用 .map
、.flatMap
、for
-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
的语义并不真正意味着它是一种 容器 ,它包含我们可以从容器中取出的值。相反,它捕捉了将副作用与评估业务逻辑分开执行的想法。