flatten

http://kmonos.net/wlog/80.html#_0950071204

無限リストの無限リストだとどうでしょう。単純にflattenしてしまうと、先頭にあったリストの要素以外は永遠に出てきません。
(snip)
これだと不便なこともあります。というわけでお題。順番はどう変えてもいいから、とにかく『どの要素もいつかは出てくる(有限ステップ以内には出てくる)』ように列挙したリストを返す関数を作ってみてください。

import List

main = putStrLn $ show $ take 100 $ iflat [[(x,y)|y<-[0..]]|x<-[0..]]

iflat :: [[a]] -> [a]
iflat xs = iflathelper xs []
  where iflathelper (x:xs) ys = h ++ iflathelper xs (x:t)
          where h = map head ys
                t = map tail ys

で、いかがでしょうか。
「「有限か無限かわからんリストの有限か無限かわからんリスト」に対しても適切に動作する」のはお任せいたします。