Sea la función split :: [a ] → ([a ], [a ]), que divide la lista en dos listas colocando sus elementos de forma alternada. Por ejemplo split [2, 4, 6, 8, 7] resulta en ([2, 6, 7], [4, 8]).
(b) Implemente split usando foldl.
Se me ocurrió la siguiente solución:
split = rv.fst.foldl spL (([ ],[ ]), 0) Se trata de dos listas con un parámetro que permite saber en cual agregar a continuación
spL (([ ],[ ]) , 0) z = (([z],[ ]) , 1)
spL ((x:xs,[ ]) , 1) z = ((x:xs, [z]) , 2)
spL ((x:xs, y:ys), n) z | even n = ((z:x:xs, y:ys), n+1)
| otherwise = ((x:xs,z:y:ys) , n+1)
rv (xs,ys) = (reverse xs, reverse ys)
Pero spL parece no contemplar todos los casos posibles
*** Exception: <interactive>:19:1-59: Non-exhaustive patterns in function spL
No logro darme cuenta que casos estarían faltando. Si pudieran darme alguna ayuda genial :)
Saludos.