Java FoldMap列表,或“如何摆脱懒惰/急切的不和谐”

时间:2012-02-05 03:30:33

标签: java haskell collections functional-java

我正在将this package移植到Java上,并试图绕过这两种语言之间的懒惰/急切不和。我不认为它会像它那样严重,因为实现完全取决于函数类型,但我想我错了。我如何保持足够的懒惰才能发挥作用?或者,我如何最低限度地重写它,以便它变得足够渴望Java?

守则

现在直接在pastebin上提供,谢谢你告诉我。

InfiniteListException.java

TransformFunc.java

TransformCSFunc.java

FM.java

FMList.java

问题

我几乎在每个“功能样式”方法上都会出现堆栈溢出(heh),并且必须几乎不断地调用force(),以便即使在编码功能时也要阻止它们

3 个答案:

答案 0 :(得分:3)

你会讨厌我的答案,因为将代码从功能语言转换为命令语言只是一种真正的痛苦,即使它没有出现在前面。

基本上你可以做两件事:

  1. 重写以删除递归。这并非总是可行,也不容易。有时候,有一个算法可以做到这一点(我能想到的唯一一个算法是,当函数是尾递归时,但可能还有更多)。其他时候,你必须自己完成这项工作并编写一个与原版相同的自定义函数,但不使用递归。

  2. 您可以构建自己的类似调用堆栈的系统,而不是语言正在使用的调用堆栈。这允许你对函数语言进行优化,但是命令式的却没有,它允许你为每个函数提供一个堆栈,这确实减少了堆栈耗尽的可能性,它还允许你拥有堆栈的你喜欢的尺寸。

  3. 当然,你可以根据需要结合使用这两种技术,因为基本上你需要一个解决方案来解决脚本中使用的每一个函数。

    正如我所说,这不是好消息。这是非常糟糕的新闻,因为这意味着如果你想将这个(或任何其他)功能库移植到命令式世界,那么前面还有很多工作要做。

答案 1 :(得分:1)

我对FoldMap不熟悉,但是一些函数java的List函数(也是ArraysStreams)是使用常量堆栈空间在内部实现的,请查看例如foldLeftforeach,也许他们可以提供帮助..

答案 2 :(得分:1)

非传统的方法是使用Frege编译略微修改的Haskell源代码。

所需的修改通常仅限于导出列表(Frege没有)和导入。