
What about diag [[1,2,3],[4],[5,6,7]] ? What it should be? Sebastian Fischer wrote on 15.04.2009 15:28:
Prelude> let diag = concat . diags where diags ((x:xs):xss) = [x] : zipWith (:) xs (diags xss)
this has a different semantics on finite lists, so I should add a test case:
*Main> diag [[1,2,3],[4,5,6],[7,8,9]] [1,2,4,3,5,7,6,8,9]
Your version yields [1,2,4,3,5,7].
Actually, there are a number of implementations that implement the same behaviour as the original version, e.g.,
diag = concat . foldr diags [] where diags [] ys = ys diags (x:xs) ys = [x] : merge xs ys
merge [] ys = ys merge xs@(_:_) [] = map (:[]) xs merge (x:xs) (y:ys) = (x:y) : merge xs ys
I'd be interested if one can *derive* from the original version a simpler version using clever pointfree combinators.
Cheers, Sebastian _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe