【发布时间】:2019-09-22 07:45:34
【问题描述】:
我有以下代码,我想知道为什么变量 number 会被计算两次:
import cats.effect.IO
import scala.util.Random
object Main {
private val number: IO[Int] =
IO(Random.between(3, 300))
def main(args: Array[String]): Unit = {
number
.flatMap { e =>
println(e);
number
}.flatMap { e =>
println(e);
IO.unit
}.unsafeRunSync()
}
}
该程序打印两个不同的数字,尽管该数字是一个赋值。我知道,我描述的是计算而不是执行,在宇宙的尽头,我运行程序。
问题是,为什么它会打印出两个不同的数字?
【问题讨论】:
-
我找不到
Random.between。 -
请注意,如果它返回相同的值,则会破坏引用透明度,这是首先引入
IO的唯一原因。另外,您的 prints 是错误的,所有效果都必须暂停在IO内。
标签: scala functional-programming io-monad