Fusionando dos listas en Haskell
merge functional-programming (6)
Entonces, ¿por qué crees que simple (concat. Transpose) "no es lo suficientemente bonito"? Supongo que has intentado algo como:
merge :: [[a]] -> [a]
merge = concat . transpose
merge2 :: [a] -> [a] -> [a]
merge2 l r = merge [l,r]
Por lo tanto, puede evitar la recursión explícita (frente a la primera respuesta) y aún así es más simple que la segunda respuesta. Entonces, ¿cuáles son los inconvenientes?
No puedo averiguar cómo combinar dos listas de la siguiente manera en Haskell:
INPUT: [1,2,3,4,5] [11,12,13,14]
OUTPUT: [1,11,2,12,3,13,4,14,5]
Quiero proponer una versión más perezosa de la fusión:
merge [] ys = ys
merge (x:xs) ys = x:merge ys xs
Por ejemplo, puede consultar una pregunta SO reciente sobre la generación perezosa de combinaciones .
La versión en la respuesta aceptada es innecesariamente estricta en el segundo argumento y eso es lo que se mejora aquí.
Seguramente un caso para un despliegue:
interleave :: [a] -> [a] -> [a]
interleave = curry $ unfoldr g
where
g ([], []) = Nothing
g ([], (y:ys)) = Just (y, (ys, []))
g (x:xs, ys) = Just (x, (ys, xs))
EDITAR: ¡Eche un vistazo a la respuesta y los comentarios de Ed''ka!
Otra posibilidad:
merge xs ys = concatMap (/(x,y) -> [x,y]) (zip xs ys)
O, si te gusta el aplicativo:
merge xs ys = concat $ getZipList $ (/x y -> [x,y]) <$> ZipList xs <*> ZipList ys
-- ++
pp [] [] = []
pp [] (h:t) = h:pp [] t
pp (h:t) [] = h:pp t []
pp (h:t) (a:b) = h : pp t (a:b)
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys