Un par de veces me he encontrado queriendo un zip
en Haskell que agrega relleno a la lista más corta en lugar de truncar la más larga. Esto es bastante fácil de escribir. (Monoid
funciona para mí aquí, pero también se podría sólo tiene que pasar en los elementos que desea utilizar para el relleno.)Zipping con relleno en Haskell
zipPad :: (Monoid a, Monoid b) => [a] -> [b] -> [(a, b)]
zipPad xs [] = zip xs (repeat mempty)
zipPad [] ys = zip (repeat mempty) ys
zipPad (x:xs) (y:ys) = (x, y) : zipPad xs ys
Este enfoque pone feo cuando se trata de definir zipPad3
. He escrito el siguiente y luego se dio cuenta de que, por supuesto, no funciona:
zipPad3 :: (Monoid a, Monoid b, Monoid c) => [a] -> [b] -> [c] -> [(a, b, c)]
zipPad3 xs [] [] = zip3 xs (repeat mempty) (repeat mempty)
zipPad3 [] ys [] = zip3 (repeat mempty) ys (repeat mempty)
zipPad3 [] [] zs = zip3 (repeat mempty) (repeat mempty) zs
zipPad3 xs ys [] = zip3 xs ys (repeat mempty)
zipPad3 xs [] zs = zip3 xs (repeat mempty) zs
zipPad3 [] ys zs = zip3 (repeat mempty) ys zs
zipPad3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zipPad3 xs ys zs
En este punto hice trampa y sólo se utiliza para recoger length
la lista más larga y la almohadilla de los otros.
¿Estoy pasando por alto una forma más elegante de hacer esto, o es algo como zipPad3
ya definido en alguna parte?