首页 > 解决方案 > 描述一个计算

问题描述

我有以下代码,我想知道为什么变量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()
  }

}

该程序打印两个不同的数字,尽管该数字是一个赋值。我知道,我描述的是计算而不是执行,在宇宙的尽头,我运行程序。

问题是,为什么它会打印出两个不同的数字?

标签: scalafunctional-programmingio-monad

解决方案


之间有区别

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()


推荐阅读