Nie zamierzam psuć twojej zabawy, próbując pełnej odpowiedzi, więc pozwól mi zademonstrować garść rzeczy poprzez uproszczony problem wyliczenia wszystkich skończonych, niepustych sekwencji sąsiadujących ze sobą naturałów, począwszy od zera - coś że wydajesz się już bliska osiągnięcia na własną rękę. Kluczowe kroki są już zawarte w twoim enumIntSeqs
, ale nie musisz zagnieżdżać takich wyrażeń na liście. Jeśli zaczynasz z ...
[ {- etc. -} | x <- [0..] ]
... można wygenerować nową listę dla każdego x
po prostu robi ...
[ {- etc. -} | x <- [0..], let ys = [0..x] ]
... a wracając do tych list:
[ ys | x <- [0..], let ys = [0..x] ]
(Zauważ, że nie napisałem ys <- [0..x]
. Spróbuj przewidzieć, co by się stało w tym przypadku, a następnie sprawdzić w GHCi.)
Oddzielny let
definicja nie jest konieczne, ani nie dodaje niczego pod względem jasności tego prostego zrozumienia, więc możemy po prostu napisać:
[ [0..x] | x <- [0..] ]
I to wszystko.
Prelude> take 4 $ [ [0..x] | x <- [0..] ]
[[0],[0,1],[0,1,2],[0,1,2,3]]
P.S .: Dwa inne sposoby zapisu wyliczenia. Używanie do-notacji ...
someIntSeqs = do
x <- [0..]
return [0..x]
... i ze skromnym fmap
(który w tym przypadku jest taka sama jak map
):
Prelude> take 4 $ fmap (\x -> [0..x]) [0..]
[[0],[0,1],[0,1,2],[0,1,2,3]]
Prelude> -- Or, equivalently...
Prelude> take 4 $ (\x -> [0..x]) <$> [0..]
[[0],[0,1],[0,1,2],[0,1,2,3]]
Twoje pytanie nie jest bardzo jasne. –