scala - 描述一个计算

标签 scala functional-programming io-monad

我有以下代码,我想知道为什么变量 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 在评估时只是一个数字。

这与lambda(val lambda = () => Random.nextInt())和值(val value = Random.nextInt())。

关于scala - 描述一个计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58047118/

相关文章:

scala - 具有条件计数的 Pivot scala 数据框

c# - C# 中的通用不可变类

python - 将元组展开为半重复对

kotlin - 如何使用Kotlin和Arrow执行程序

haskell - 为什么GHCI出错后会得到 "stuck"处于错误状态?

scala - [ ] 和 ( ) 之间创建新 Scala 对象的区别

scala - 如何在 MLBase 中将类别变量转换为虚拟/指示变量

javascript - 如何从 scala.js 访问新的 javascript 关键字?

haskell - 从列表中删除具有相同值对的元组

haskell - IO monad防止嵌入式mapM短路?