gpt4 book ai didi

scala - 在Scala中,什么时候需要指定惰性?

转载 作者:行者123 更新时间:2023-12-02 02:54:05 25 4
gpt4 key购买 nike

在本地 Scala REPL 中,无需使用关键字 lazy 即可定义流和惰性列表。

scala> val fibo: LazyList[BigInt] = (0: BigInt) #:: (1: BigInt) #:: fibo.zip(fibo.tail).map { n => n._1 + n._2 }
fibo: LazyList[BigInt] = LazyList(<not computed>)

scala> fibo(100)
res17: BigInt = 354224848179261915075

scala> val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
| j => j * j <= i
| }.forall {
| k => i % k != 0
| })
prime: LazyList[Int] = LazyList(<not computed>)

scala> prime(100)
res18: Int = 547

这与 Stream 以及 Scastie 中的工作方式大致相同。它也应该适用于 IntelliJ 项目,对吗?

  @Test def testGCDConsecutivePrimeNumbers(): Unit = {
val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
j => j * j <= i
}.forall {
k => i % k != 0
})
for (n <- 1 to 100) {
assertEquals(1, gcd(prime(n), prime(n + 1)))
}
}

@Test def testGCDConsecutiveEvenFibonacciNumbers(): Unit = {
val fibo: LazyList[Int] = 0 #:: 1 #:: fibo.zip(fibo.tail).map(n => n._1 + n._2)
for (i <- 0 to 42 by 3) {
assertEquals(2, gcd(fibo(i), fibo(i + 3)))
}
}

但事实并非如此。

Error:(21, 67) forward reference extends over definition of value prime

val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {

Error:(32, 43) forward reference extends over definition of value fibo

val fibo: LazyList[Int] = 0 #:: 1 #:: fibo.zip(fibo.tail).map(n => n._1 + n._2)

将它们标记为惰性可以清除错误。

我知道 REPL 中有些事情的工作方式不同,但我不明白为什么这会是其中之一。我可能在这里遗漏了一些微妙之处,但为什么在 REPL 中省略“lazy”不会导致前向引用错误。一般来说,什么时候需要明确指定惰性,为什么?

最佳答案

这并不是“在 REPL 中以不同方式工作”的直接“其中之一”,而是因为它们。在失败的代码中,primefibo 是局部变量。当您直接在 REPL 中定义它们时,它们是匿名对象的属性,即它会生成类似的内容

object Line1 {
val fibo = ...
}
import Line1.fibo

如果你看一下规范,the forward reference restriction仅适用于局部变量:

It can form part of an object or class definition or it can be local to a block...

However, there is a restriction on forward references in blocks

关于scala - 在Scala中,什么时候需要指定惰性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452112/

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