[Práctico 3] [Ejercicio 9]

[Práctico 3] [Ejercicio 9]

de Santiago Correa Perini -
Número de respuestas: 4

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?

En respuesta a Santiago Correa Perini

Re: [Práctico 3] [Ejercicio 9]

de Germán Ferrari -
Hola.

La primer duda que me genera el código es qué rol está cumpliendo el booleano.

A grandes razgos lo que entiendo que querés hacer es llevar en la primera lista el resultado hasta el momento, y en la segunda la sublista que se va removiendo, para poder reincorporarla en caso que el predicado sea falso.

Cuidado con este código `ys ++ (x : xs)`. Tanto `xs` e `ys` son producto de procesar la lista a la derecha de `x`, y estás poniendo `ys` a la izquierda de `x`. Fijate que pasa con tu código con una entrada como `(<=2) [-1,-2,3,1,2]`.

Yendo a la pregunta de como sacar el `++`, vos lo estás usando para reconstruir la lista completa cuando falla el predicado. ¿Qué pasaría si la lista completa la tuvieras siempre construida? ¿se puede hacer sin usar `++`?

Saludos,
Germán.
En respuesta a Germán Ferrari

Re: [Práctico 3] [Ejercicio 9]

de Santiago Correa Perini -

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

En respuesta a Santiago Correa Perini

Re: [Práctico 3] [Ejercicio 9]

de Germán Ferrari -

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 `++`.