>>> shorterList (shorterList (repeat 'a') (repeat 'b')) "abc" "abc"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.
\(Shape xs) (List ys) -> Match.take xs ys == List.take (length xs) ys
\(Shape xs) (List ys) -> Match.drop xs ys == List.drop (length xs) ys
\(Shape xs) (List ys) -> Match.take xs ys ++ Match.drop xs ys == ys
\(Shape xs) (List ys) -> Match.takeRev xs ys == reverse (Match.take xs (reverse ys))
\(Shape xs) (List ys) -> Match.dropRev xs ys == reverse (Match.drop xs (reverse ys))