archives

Un-filter (or merge) lists

What is the standard functional construct which is the converse of filter?

Eg. if I want to add 0 between all elements of a list?

Or if I want to merge two sorted lists preserving sorting?

I am thinking of a "unfilter" construct which takes a list of lists, and a list of functions applied in turn

(*insert 0 between two elements of the list*)
unfilter [a] [fun x::xs -> (x, [xs]); fun as -> (0, [as])]

(*merge two sorted lists*)
unfilter [a;b] [fun as, bs -> match as, bs with
   | x::xs, y::ys => if y < x then (y, [as;ys]) else (x, [xs;bs])
   | [], y::ys => (y, [[];ys])
   | x::xs, [] => (x, [xs;[]])]