removeEach xs represents a list of sublists of xs,
where each element of xs is removed and
the removed element is separated.
It seems to be much simpler to achieve with
zip xs (map (flip List.delete xs) xs),
but the implementation of removeEach does not need the Eq instance
and thus can also be used for lists of functions.

Lists of lists

With concat . shear you can perform a Cantor diagonalization,
that is an enumeration of all elements of the sub-lists
where each element is reachable within a finite number of steps.
It is also useful for polynomial multiplication (convolution).

Operate on each combination of elements of the first and the second list.
In contrast to the list instance of liftM2
in holds the results in a list of lists.
It holds
concat (outerProduct f xs ys) == liftM2 f xs ys