無限オブ無限

無限オブ無限 - d.y.d. via 「無限オブ無限」をやってみた - sshi.Continual
僕もHaskellでやってみました。有限・無限のリストがまざっていても大丈夫なハズです。

module Main (main) where

infListOfInfList :: [[String]]
infListOfInfList = do
  c <- cycle ['a' .. 'z']
  return [c : n : "" | n <- cycle $ ['0' .. '9']]

infListFlatten :: [[a]] -> [a]
infListFlatten = f 1
    where
      f _ [] = []
      f n xs = let (xs1, xs2) = splitAt n xs
                   (hs, ts) = unzip $ map (\ (y : ys) -> (y, ys)) $ 
                                filter (not . null) xs1
               in hs ++ f (n + 1) (ts ++ xs2)

main :: IO ()
main = print $ take 20 $ infListFlatten infListOfInfList
-- => ["a0","a1","b0","a2","b1","c0","a3","b2","c1","d0",
--     "a4","b3","c2","d1","e0","a5","b4","c3","d2","e1"]