Compare the length of two lists over different types.
It is equivalent to
(compare (length xs) (length ys))
but more efficient.
lessOrEqualLength x y is almost the same as
compareLength x y <= EQ,
lessOrEqualLength  undefined = True,
compareLength  undefined <= EQ = undefined.
Returns the shorter one of two lists.
It works also for infinite lists as much as possible.
shortList (shorterList (repeat 1) (repeat 2)) [1,2,3]
can be computed.
The trick is, that the skeleton of the resulting list
is constructed using
zipWith without touching the elements.
The contents is then computed (only) if requested.