Chciałbym wygenerować dość duży, ale skończony, kartezjański produkt w Haskell, który muszę następnie iterować (myślę, że funkcja podziału na model pola średniego). Naturalną rzeczą do zrobienia używa sequence
coś takiego:Leniwy produkt kartezjański w Haskell
l = sequence $ replicate n [0,1,2]
Niestety, dla dużej n
, to nie mieści się w pamięci i biegnę z hałdy, jak tylko poprosić o length l
na przykład. Potrzebowałabym sposobu, żeby leniwie zrobić to samo. Skończyło się „odkrywając” Base-3 arytmetyki, tak,
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
(które działa), ale wydaje się, jakby odkrywanie koła na nowo, a poza tym to jest zbyt szczegółowe. Jaki byłby lepszy leniwy sposób generowania produktu?
Czy zależy Ci na kolejności elementów w wyniku? – augustss
Nie, o ile nie ma powtórzeń. –
Jak duże jest 'n'? – dave4420