
On Sat, 2006-11-04 at 21:25 -0500, Jan-Willem Maessen wrote:
On Nov 3, 2006, at 11:58 AM, Bulat Ziganshin wrote:
while we are here, i also propose to export from Data.List 'merge' function that is useful on its own
Yes, please. This qualifies as my most commonly rewritten multi-line Haskell function.
That said, I've also written most of the variations of merge you might care to imagine (indeed, sorted-list sets and multisets together use pretty much all of them if you include difference and merging of equals).
Yes, there are a number of different options for what we might call 'merge'. It would be good to discuss what the variations are and which variations might be sensible to include in a standard lib and what they might be called. However I think this is a separate issue from the discussion about 'on'. So start a new thread and lets try and find out if there is a consensus. As an example variation from a program I wrote: -- mergeBy cmp xs ys = (only_in_xs, in_both, only_in_ys) mergeBy :: (a -> b -> Ordering) -> [a] -> [b] -> ([a], [(a, b)], [b]) mergeBy cmp = merge [] [] [] where merge l m r [] ys = (reverse l, reverse m, reverse (ys++r)) merge l m r xs [] = (reverse (xs++l), reverse m, reverse r) merge l m r (x:xs) (y:ys) = case x `cmp` y of GT -> merge l m (y:r) (x:xs) ys EQ -> merge l ((x,y):m) r xs ys LT -> merge (x:l) m r xs (y:ys) It's rare of course that you need the generality of merging lists of different types. Though of course this also covers the slightly more common case of comparing where == is only an equivalence relation and you want to keep or combine both elements. Duncan