Ленивое декартово произведение в Haskell

Я хотел бы сгенерировать довольно большое, но конечное декартово произведение в 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

(, которая работает ), но это похоже на изобретение велосипеда, и, кроме того, это слишком специфично. Какой может быть лучший ленивый способ создания продукта?

9
задан Vincent Beffara 12 April 2012 в 00:44
поделиться