Buenas, plantee la siguiente solución para la parte a) :
Mi pregunta es si está bien la solución y si se podría evitar el uso de ++ para que quede más eficiente la función, no se me ocurre cómo.
A su vez, se puede obviar algún paréntesis? Y por último, al compilarlo me salta una warning por el uso de tabs, se pueden configurar las flags con las que compila WinGHCi de alguna manera?
Buenas
Es cierto, me equivoque en `ys ++ (x : xs)`, debería ser `x:(ys ++ xs)`.
El rol que cumple el booleano es ese que describiste, como con foldr la recorres de derecha a izquierda, puede pasar que encuentres a un elemento que no cumpla la condición pero no sea la primera ocurrencia. Y lo que se me ocurrió fue eso, mantener la lista en paralelo desde que encontre un elemento que si cumple la condición, y si vuelvo a encontrar uno que no, junto las listas.
No entendí tu pregunta, porque en realidad uso `++` para reconstruir la lista justamente cuando vuelve a fallar el predicado en caso de que venía de elementos que si lo cumplian, por ejemplo en:
(<=2) [-1,-1,3,-1,-2,3,1,2]
como entrada, después de procesar el primer 3 (de derecha a izquierda), ys = [-1,-2] al llegar al segundo 3 y ahi se ejecuta `x:(ys ++ xs)`
Saludos
Si te fijás, en la descripción que yo hago de lo que entendí que querés hacer, no hago referencia al booleano. Fijate si no podés prescindir de él.
La pregunta final intenta guiarte a una solución sin usar el `++`. Si en cada paso la lista completa estuviera disponible, podrías evitar tener que construirla con `++`.
Ah bien! Ya entendí, llegue a esto:
Gracias!
Saludos