考虑这段代码(取自Martin Odersky的" Scala中的函数编程原理 "课程):
def sieve(s: Stream[Int]): Stream[Int] = {
s.head #:: sieve(s.tail.filter(_ % s.head != 0))
}
val primes = sieve(Stream.from(2))
primes.take(1000).toList
Run Code Online (Sandbox Code Playgroud)
它工作得很好.请注意,sieve事实上它不是尾递归(或者是它?),即使Stream尾部是懒惰的.
但是这段代码:
def sieve(n: Int): Stream[Int] = {
n #:: sieve(n + 1).filter(_ % n != 0)
}
val primes = sieve(2)
primes.take(1000).toList
Run Code Online (Sandbox Code Playgroud)
抛出StackOverflowError.
第二个例子有什么问题?我filter想搞砸了,但我不明白为什么.它返回一个Stream,所以它不会让评价急切(我是对的吗?)
示例:https : //jsfiddle.net/gnxdkqgh/5/
x0.5- 一切正常x2- 超出原始矩形的画布部分未正确重绘x2快速连续单击- 您可以看到它绘制了动画虚线,但无法“清除”画布。它只是绘制现有的破折号,从而形成实线。这是Paper.js 中的错误还是我做错了什么?
我正在使用最新的 Chrome。如果您无法重现问题,请使用以下屏幕截图: