首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`forever`组合器上的StackOverflow

`forever`组合器上的StackOverflow
EN

Stack Overflow用户
提问于 2014-02-25 11:29:10
回答 1查看 93关注 0票数 3

Functional Programming in Scalaforever组合器

代码语言:javascript
复制
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时递增该变量:

代码语言:javascript
复制
var count = 0
def forever[A, B](a: F[A]): F[B] = {
  lazy val t = { println(count); count = count + 1; forever(a) }
}

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

代码语言:javascript
复制
 "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失败。

代码语言:javascript
复制
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的每次执行占用了多少堆栈内存?

EN

回答 1

Stack Overflow用户

发布于 2014-02-25 16:36:45

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22003986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档