我有一个动态编程算法,我发现我的Haskell实现非常令人满意,因为它允许我递归地定义主数组,如下所示:

fill :: Int -> Int -> Entry
fill 0 0 = Entry Origin 0.0
fill 0 j = ...
fill i 0 = ...
fill i j = f m i j

m :: Array (Int, Int) Entry
m = listArray dims [fill i j | (i, j) <- range dims]

其中 f 是一个中等复杂的函数,返回主数组 m . Entry 类型只是一个带有小注释的 Double .

数据本身非常大, m 最终有大约100M条目 . 该算法仍然快速,但它在此过程中使用~25GB RAM . 从阅读中我理解这是因为它保持数组条目的完整计算而不是最终值,但如果我切换到未装箱的数组,我无法像上面的例子那样递归地定义它们 .

有没有办法吃蛋糕(内存占用少)并吃掉它(递归定义)?