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