gpt4 book ai didi

scala - `forever` 组合器上的 StackOverflow

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

查看 Functional Programming in Scala 中的 forever 组合子:

trait AddlCombinators[F[_]] extends Monad[F] with Functor[F] {
def forever[A, B](a: F[A]): F[B] = {
lazy val t: F[B] = forever(a)
flatMap(a)(_ => t)
}
}

如书中所述,我遇到了 StackOverflow。

然后,我添加了一个 count 变量,每次访问 t 时都会递增它:

var count = 0
def forever[A, B](a: F[A]): F[B] = {
lazy val t = { println(count); count = count + 1; forever(a) }
}

然后,我创建了一个 ScalaTest 测试:

 "running forever" should "throw a StackOverflow exception" in {
val listCombinator = new AddlCombinators[List] {

// omitted implementation of `Monad[List]` and `Functor[List]`
}
listCombinator.forever(List(1))
}
}

运行上述测试 3 次后,每次都在 ~1129/1130 上失败。

1129
[info] TestCombinators:
[info] running forever
[trace] Stack trace suppressed: run last test:testOnly for the full output.
[error] Could not run test test.TestCombinators: java.lang.StackOverflowError

为什么它在崩溃前达到了那个数字?另外,我如何推断每次执行 forever 占用了多少堆栈内存?

最佳答案

由于堆栈大小,它达到了这个数字。可以使用 -Xss 设置大小,默认值因平台和 VM/版本而异。但一般来说,当您收到 StackOverflowError 时,您应该尝试修复代码中的问题,而不是您的设置中的问题。在这种情况下,我会使用蹦床来防止堆栈溢出。可以在这里找到一个很好的解释:http://blog.higher-order.com/assets/trampolines.pdf

关于scala - `forever` 组合器上的 StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22003986/

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