gpt4 book ai didi

Scala lazy val解释

转载 作者:行者123 更新时间:2023-12-01 12:39:01 26 4
gpt4 key购买 nike

我正在 Coursera 上学习 Scala 函数式编程类(class),但我很难理解这段代码 -

def sqrtStream(x: Double): Stream[Double] = {
def improve(guess: Double): Double = (guess+ x/ guess) / 2
lazy val guesses: Stream[Double] = 1 #:: (guesses map improve)
guesses
}

当我执行 sqrtSteam(4).take(10).toList 时,此方法会以精度递增的顺序找到 4 的 10 近似平方根。

有人可以在这里解释一下猜测的评估策略吗?我的疑问是,当第二个猜测值被拾取时,猜测值被替换为什么值?

最佳答案

让我们从简化的例子开始:

 scala> lazy val a: Int  = a + 5
a: Int = <lazy>

scala> a
stack overflow here, because of infinite recursion

所以 a 正在重新计算,直到它获得一些稳定的值,如下所示:

scala> def f(f:() => Any) = 0 //takes function with captured a - returns constant 0
f: (f: () => Any)Int

scala> lazy val a: Int = f(() => a) + 5
a: Int = <lazy>

scala> a
res4: Int = 5 // 0 + 5

您可以将 def f(f:() => Any) = 0 替换为 def f(f: => Any) = 0,因此 a 定义看起来像是真的传递给了 f:lazy val a: Int = f(a) + 5

Streams 使用相同的机制 - guesses map improve 将作为按名称调用的参数传递(并且链接到惰性 a 的 lambda 将保存在 Stream 中,但不会计算直到请求尾部),所以它就像 lazy val guesses = #::(1, () => guesses map improve)。当您调用 guessess.head - tail 将不会被评估; guesses.tail 将延迟返回 Stream (improve(1), ?)guesses.tail.tail 将是 Stream(improve (improve(1)), ?) 等等。

关于Scala lazy val解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26796955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com