Tôi muốn tạo ra một sản phẩm Cartesian khá lớn nhưng hữu hạn trong Haskell, mà tôi cần sau đó lặp lại (suy nghĩ chức năng phân vùng của mô hình trường trung bình). Điều tự nhiên để làm sử dụng sequence
, như thế này:Sản phẩm cartesian lười biếng trong Haskell
l = sequence $ replicate n [0,1,2]
Thật không may, cho lớn n
, điều này không phù hợp trong bộ nhớ và tôi chạy ra khỏi đống ngay sau khi tôi yêu cầu length l
ví dụ. Tôi sẽ cần một cách để làm điều tương tự một cách lười biếng. Tôi đã kết thúc "khám phá lại" arithmetics cơ bản-3, như thế này, như thế này,
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
(hoạt động) nhưng nó cảm thấy như phát minh lại bánh xe, và bên cạnh đó là quá cụ thể. Điều gì sẽ là một cách lười biếng tốt hơn để tạo ra sản phẩm?
Bạn có quan tâm đến thứ tự của các phần tử trong kết quả không? – augustss
Không, miễn là không có sự lặp lại. –
Bạn cần 'n' bao nhiêu? – dave4420