我正在将this package移植到Java上,并试图绕过这两种语言之间的懒惰/急切不和。我不认为它会像它那样严重,因为实现完全取决于函数类型,但我想我错了。我如何保持足够的懒惰才能发挥作用?或者,我如何最低限度地重写它,以便它变得足够渴望Java?
现在直接在pastebin上提供,谢谢你告诉我。
我几乎在每个“功能样式”方法上都会出现堆栈溢出(heh),并且必须几乎不断地调用force()
,以便即使在不编码功能时也要阻止它们
答案 0 :(得分:3)
你会讨厌我的答案,因为将代码从功能语言转换为命令语言只是一种真正的痛苦,即使它没有出现在前面。
基本上你可以做两件事:
重写以删除递归。这并非总是可行,也不容易。有时候,有一个算法可以做到这一点(我能想到的唯一一个算法是,当函数是尾递归时,但可能还有更多)。其他时候,你必须自己完成这项工作并编写一个与原版相同的自定义函数,但不使用递归。
您可以构建自己的类似调用堆栈的系统,而不是语言正在使用的调用堆栈。这允许你对函数语言进行优化,但是命令式的却没有,它允许你为每个函数提供一个堆栈,这确实减少了堆栈耗尽的可能性,它还允许你拥有堆栈的你喜欢的尺寸。
当然,你可以根据需要结合使用这两种技术,因为基本上你需要一个解决方案来解决脚本中使用的每一个函数。
正如我所说,这不是好消息。这是非常糟糕的新闻,因为这意味着如果你想将这个(或任何其他)功能库移植到命令式世界,那么前面还有很多工作要做。
答案 1 :(得分:1)
答案 2 :(得分:1)
非传统的方法是使用Frege编译略微修改的Haskell源代码。
所需的修改通常仅限于导出列表(Frege没有)和导入。