Problema con la eta Reducción

Problema con la eta Reducción

de Agustin Jose Rodriguez Ayusto -
Número de respuestas: 2

Buenas,

Tengo un problema bastante raro al hacer la eta reduccion ya que cuando pruebo el caso07 de prueba pasa lo siguiente:
Si pongo  ./Linter -s  ejemplos/caso07.mhs las sugerencias que devuelve en la funcion qux (aclaro que las otras funciones del mismo caso de prueba me dan bien) (la entrada de la funcion qux es la siguiente qux = \xs -> (\ys -> case ys of [] -> 0; (x : xs) -> 1 + xs) xs) :
Función: qux 

**Sugerencia para:

\xs -> (\ys -> case ys of

    [] -> 0;

    (x : xs) -> 0) xs

Usar eta-reducción. Reemplazar por:

\ys -> case ys of

    [] -> 0;

    (x : xs) -> 0

lo cual es bastante raro ya que por alguna razón se cambia 1+xs por 0 sin ninguna sugerencia.
Ahora cuando lo hago con la bandera -lintEta no me tira ninguna sugerencia.
Como leí del foro hoy que en el caso 7 era equivalente  a:
\xs -> (\ys -> case ys of
[] -> 0;
(x : zs) -> 1 + zs) xs
entonces lo que hice fue sustituir la entrada del caso de prueba por eso cambiando el xs del case por zs y funcionó correctamente, incluso con la bandera de -lintEta y sin ella (de hecho en el caso 12 en la función incr se me corrigen los errores de la eta reducción si cambio esos xs del caso por zs).
Quería saber si me pueden dar algún indicio de donde puede estar el error(sabiendo que es complicado sin ver el código) pero estuve todo el día tratando de solucionarlo y no logre hacerlo, incluso me fije a ver si las funciones de combinaciones de lintings podían llegar a estar mal pero la verdad es que no les encontré ningún error.

En respuesta a Agustin Jose Rodriguez Ayusto

Re: Problema con la eta Reducción

de Luis Sierra -
hola agustín

1. observa que la eta-reducción parece comportarse bien: elimina el xs que debe eliminar. la aparición del cero debe venir de otro lint.

2. el cero debe venir de algún lado. si fuera un cero raro que se te hubiera escapado en el código, lo habrías visto. así que supongo que debe venir del único cero que aparece por ahí: el que aparece en [] -> 0.

3. se me ocurre que en algún lugar del código, en un lint que no necesariamente es el de la eta reducción, desarmás y rearmás el case, y que al rearmarlo en vez de ubicar el primer caso en el primer lugar y el segundo caso en el segundo lugar, colocás el primer caso en ambos lugares.

saludos

luis
En respuesta a Luis Sierra

Re: Problema con la eta Reducción

de Alberto Pardo -
Hola,

Además de lo que mencionaba Luis, me da la sensación que tenés algún problema con la detección de variables libres y ligadas en el caso de un case. Digo por tu comentario de que al cambiar xs por zs te funciona bien. Capaz no estás teniendo en cuenta que las variables que aparecen en el pattern `cons` del case "ligan" sus ocurrencias *libres) en la expresión correspondiente a ese caso.

Saludos,
Alberto.