为什么这些代码行会冻结Scala / SBT构建?

时间:2013-11-07 09:54:58

标签: scala playframework sbt playframework-2.2

从Play Framework 2.1转换到2.2(Scala)我正在重构一些代码并找到一些代码行来完全冻结SBT构建,直到该进程因java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded而被终止。 Eclipse(尝试使用Juno和Kepler,但我怀疑它与此有什么关系)冻结了,它甚至不再加载工作台了。

所以,这是代码。我很想知道是什么让编译器冻结,而不仅仅是在这里给出错误。

def foo = Action { implicit request =>
  someForm.bindFromRequest.fold(
    formWithErrors => Ok,
    form => Async { Future.successful(Ok) }
    )
}

我已经解决了这个问题,但我很好奇为什么这会冻结一切。我在Mac上运行java(1.7.0_40)。

更新:此外,我正在使用Scala 2.10.2。我的同事可以在他的电脑上编译,但在Async上有弃用警告。

1 个答案:

答案 0 :(得分:0)

Scala中有一些表达式,当你要求编译器对它们进行评估时,它会实例化一个类型实例的TON,试图找出两种类型之间的统一差异。最有可能的是,您返回的类型并非您所期望的类型。

我会明确注释结果类型:

def foo = Action { implicit request =>
  someForm.bindFromRequest.fold[Result](
    formWithErrors => Ok,
    form => Async { Future.successful(Ok) }
  )
}

这应该有助于类型推断器知道类型是什么,只检查它们是否匹配,而不是无限扩展。此外,听起来它可能是一个scala编译器错误。