我在这个问题上看到了这个引用:什么是构建Web服务的好函数语言?
特别是Scala不支持尾调用消除,除了自递归函数,这限制了你可以做的组合种类(这是JVM的一个基本限制).
这是真的?如果是这样,那么创建这个基本限制的JVM是什么呢?
我在Scala中编写了一个简单的深度优先搜索,具有这样的递归函数:
search(labyrinth, path, goal)
Run Code Online (Sandbox Code Playgroud)
迷宫是问题的规范(如图或其他),path是一个列表,它保存到目前为止所采用的路径,目标是目标状态的规范.如果找不到路径,该函数将返回作为List的目标路径和Nil.
该函数扩展,例如找到所有合适的下一个节点(候选),然后必须递归调用自身.
我是这样做的
candidates.foldLeft(Nil){
(solution, next) =>
if( solution == Nil )
search( labyrinth, next :: path, goal )
else
solution
}
Run Code Online (Sandbox Code Playgroud)
请注意,我省略了一些不必要的细节.到目前为止一切正常.但是一旦在foldLeft调用中找到了解决方案,这个解决方案就会被if语句的else部分复制.有没有办法通过打破foldLeft或使用不同的函数而不是foldLeft来避免这种情况?实际上我可能会写一个版本的foldLeft,它会在我自己返回"not Nil"时中断.但API中有一个吗?