我想在 Haskell 中生成一个相当大但有限的笛卡尔积,然后我需要对其进行迭代(想想平均场模型的配分函数)。自然而然的事情使用sequence
, 像这样:
l = sequence $ replicate n [0,1,2]
不幸的是,对于大n
,这不适合内存,当我请求时我就会用完堆length l
例如。我需要一种方法来懒惰地做同样的事情。我最终“重新发现”了 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
(有效)但感觉就像重新发明轮子,而且它太具体了。生成产品的更好的懒惰方式是什么?
与顺序相比,通过相反的顺序绑定可以获得更内存友好的方式,
foo 0 _ = [[]]
foo k xs = [h:t | t <- foo (k-1) xs, h <- xs]
由于共享较少,速度较慢,但由于内存是您的问题,也许它对您来说已经足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)