Java FoldMap 列表,或 "how to get around the lazy/eager dissonance"

标签 java haskell collections functional-java

我正在移植 this package到 Java,并试图解决两种语言之间懒惰/急切的不和谐而陷入困境。我不认为它会像现在这样严重,因为实现完全取决于函数类型,但我想我错了。我如何保持足够的懒惰来让它工作?或者,我如何尽可能少地重写它,使其对 Java 变得足够渴望?

代码

现在可以直接在 pastebin 上使用,谢谢你告诉我。

InfiniteListException.java

TransformFunc.java

TransformCSFunc.java

FM.java

FMList.java

问题

我几乎在每个“函数式”方法上都会遇到堆栈溢出(呵呵),并且几乎必须不断调用 force() 以防止它们发生,即使 不是 功能性编码。

最佳答案

你会讨厌我的回答,因为将代码从函数式语言转换为命令式语言真的很痛苦,即使它没有出现在前面。

基本上您可以做两件事:

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

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

当然,您可以根据需要组合使用这两种技术,因为基本上您需要为脚本中使用的每个函数提供解决方案。

正如我所说,这不是好消息。这是一个非常糟糕的消息,因为这意味着如果您想将这个(或任何其他)函数库移植到命令式世界,还有很多工作要做。

关于Java FoldMap 列表,或 "how to get around the lazy/eager dissonance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146687/

相关文章:

java - 在 JPanel 上绘制多个 JComponent 不起作用

java - 定义具有多个属性的 OSGi DS 引用过滤器

generics - haskell Data.HList 的简单使用示例

data-structures - 具有多个游标的 zipper 式数据结构

Haskell 模式匹配 do 表达式编译器警告

Python:是否有双端队列的线程安全版本?

java - 使用 vavr 中的索引遍历列表

java - 我该如何帮助 CMS GC "die fast"

Java 8,将文件名数组转换为文件数组

Java 8 : performance of Streams vs Collections