我想在 Haskell 中生成一个相当大但有限的笛卡尔积,然后我需要对其进行迭代(想想平均场模型的分区函数)。自然的事情就是使用sequence
,像这样:
l = sequence $ replicate n [0,1,2]
不幸的是,对于 large 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
(有效)但感觉就像重新发明轮子,而且它太具体了。生成产品的更好的懒惰方式是什么?