【发布时间】:2012-04-24 18:11:36
【问题描述】:
我想在 Haskell 中生成一个相当大但有限的笛卡尔积,然后我需要对其进行迭代(想想平均场模型的分区函数)。理所当然的使用sequence,像这样:
l = sequence $ replicate n [0,1,2]
不幸的是,对于大的n,这不适合内存,例如,我一请求length l,就会用完堆。我需要一种方法来懒惰地做同样的事情。我最终“重新发现”了 base-3 算术,就像这样,
nextConfig [] = []
nextConfig (0:xs) = 1:xs
nextConfig (1:xs) = 2:xs
nextConfig (2:xs) = 0:(nextConfig xs)
ll = take (3^n) $ iterate nextConfig $ replicate n 0
(有效)但感觉就像重新发明轮子,而且它太具体了。生成产品的更好的懒惰方式是什么?
【问题讨论】:
-
你关心结果中元素的顺序吗?
-
没有,只要没有重复即可。
-
n需要多大? -
20 或 30 之类的;我现在并不真正关心计算时间,但肯定
3^n超出了 RAM 大小。
标签: haskell lazy-evaluation cartesian-product