我对函数式编程并不熟悉,现在我想解决一个问题:递归生成一组列表的笛卡尔积。
我需要的功能与 sequence
完全相同(如此处所述:Calculate n-ary Cartesian Product),只是我不想将整个内容表示为列表。目前我正在使用 sequence
,但遇到了类似于这里描述的问题变体:Summing a large list of numbers is too slow。
例如,sequence [[1,2,3],[1,2,3]]
会产生 [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]
。每个组合(例如 [1,2]
)都可以接受作为一个列表进行处理,我只是想避免构建长列表,而是在计算时递归处理数据。我该如何处理?
目前我正在做类似于以下 ghci 示例的操作:
> let stuff = sequence $ replicate 10 [0..9]
> let morestuff = map (sum . take 2 . reverse . sort) stuff
> sum morestuff
最后一个命令太慢了,非常非常慢。
Control.DeepSeq
中的rnf
。话虽如此,您正在生成和求和大约10^10个东西,也就是说十亿。因此,无论您如何编写代码,我都不认为这样做会很顺利。 - sclv