scala - 描述一个计算
问题描述
我有以下代码,我想知道为什么变量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()
}
}
该程序打印两个不同的数字,尽管该数字是一个赋值。我知道,我描述的是计算而不是执行,在宇宙的尽头,我运行程序。
问题是,为什么它会打印出两个不同的数字?
解决方案
之间有区别
private val number: IO[Int] = IO(Random.nextInt())
和
private val number2: Int = Random.nextInt()
number
是在评估时计算随机数的值。当多次评估时,此类型值IO
(也称为此计算)会运行多次,从而产生多个不同的随机数。
而number2
在评估时只是一个数字。
val lambda = () => Random.nextInt()
这与 lambda ( ) 和 value ( )之间的区别非常相似val value = Random.nextInt()
。
推荐阅读
- java - 为什么 math.ceiling 不四舍五入我的数字?爪哇
- python - 通过单击链接将用户添加到模型
- firebase - 一个文档或一个字段是否在 Cloud Firestore 中计为一次读取?
- node.js - 导出/导入 Nightmare.js 函数
- javascript - 保持物化中显示的范围值
- regex - 带下划线的特殊字符(postgres 中的正则表达式)
- python - 将 FOR LOOP 的所有结果存储在数组中
- sql - 在一列上获得不同,按另一列排序
- android - SMS Retriever API android 系统无法将消息发送到广播接收器
- java - 使用 ArrayList 中的值创建新文本文件的最简单方法是什么?