Pointfree diagonalization in Haskell
James@Waterpoint (Xplat on Freenode) mentioned an interesting problem: write an elegant point-free expression to compute the diagonal of a list of lists (that is, from [[00, 01, 02, ...], [10, 11, 12, ...], ...] obtain [00, 11, ...]).
diag = (map head) . (foldr (flip ((flip (:)) . (map tail))) )
My version, which needs a non-pointfree helper function (but one which others have invented before, and perhaps ought to be in the standard libraries), but has fewer flips:
import Control.Arrow ((***)) import Data.List (unfoldr) uncons xs = case xs of (x:xs') -> Just (x,xs');  -> Nothing diag = unfoldr (fmap (head *** (map tail)) . uncons)
uncons is sort of the opposite of
unfoldr, in that
unfoldr uncons = id.
Update: darius's version, from the comments:
diag = flip (zipWith (!!)) [0..]