Tom Pledger writes:
| > diag  = foldr (diag2 []) [[]] where
| >   diag2 zs (x:xs) ys     = (zipWith (:) (x:zs) ys) ++ diag2 (x:zs) xs ys
| >   diag2 zs []     (_:ys) = (zipWith (:) zs     ys) ++ diag2 zs     [] ys
| >   diag2 _  _      _      = []

... which hangs when given a mixture of empty and infinite lists.
(Blush.)  This is better behaved:

> diag = foldr (diag2 []) [[]] where
>   diag2 [] []     _      = []
>   diag2 _  _      []     = []
>   diag2 zs (x:xs) ys     = (zipWith (:) (x:zs) ys) ++ diag2 (x:zs) xs ys
>   diag2 zs []     (_:ys) = (zipWith (:) zs     ys) ++ diag2 zs     [] ys


Reply via email to