Prueba 2018 - Duda ejercicio 5

Prueba 2018 - Duda ejercicio 5

de Valentina Pereira Ciaffone -
Número de respuestas: 3
Hola, me quedó la duda de por qué en este ejercicio la correcta no es la b):

Porque, la definición de A es correcta, entonces se puede descartar la (a).
Pero cuando llegué a la (b) lo primero que observé es que se hace "head ps", y que es para el caso que se usa el constructor "A [A]", pero en ese caso, A [] tiparía correctamente, entonces al momento de llamar a "copia (A[])" entraría por el constructor A en la 3era definición, haría "ps = map copia []" entonces "ps = []" y luego se ejecutaría "head []" y eso da error porque head tiene como precondición que la lista no sea vacía. 
Entonces, la duda es ¿Qué parte de este razonamiento está mal?, o si en su defecto lo que está mal es la solución. 
Muchas gracias! 
En respuesta a Valentina Pereira Ciaffone

Re: Prueba 2018 - Duda ejercicio 5

de Alberto Pardo -
Hola Valentina,

Fijate que lo que dice la opción (b) es que el código no compila porque la definición de copia es incorrecta. Estoy de acuerdo con lo que decís, va a dar error en head [], pero eso es en tiempo de ejecución. La definición de copia va a compilar sin problemas, solo que va a tener problema cuando se ejecute aplicado a (A []).

Salvo en casos muy puntuales (y muchos compiladores no lo implementan), en tiempo de compilación el compilador no se puede dar cuenta que head se está aplicando (o se va a aplicar) a la lista vacía. La lista "as" contenida en una expresión (A as) tal vez es el resultado de computar otra cosa, o sea, no necesariamente es una lista construida en ese momento. Es el problema que uno acarrea al usar funciones inseguras como es el caso de head o tail (a menos que se usen en un contexto donde uno sabe que la lista es no vacía). 

Saludos,
Alberto.  
En respuesta a Alberto Pardo

Re: Prueba 2018 - Duda ejercicio 5

de Eduardo David Gastelu Leivas -
¿Puedo preguntar por qué la 'c' no es correcta?
Saludos y gracias
En respuesta a Eduardo David Gastelu Leivas

Re: Prueba 2018 - Duda ejercicio 5

de Alberto Pardo -
Hola,

El problema de la respuesta c) es que no es verdad que para todo t, fst (copia t) siempre retorna t. Por ejemplo, fst (copia (A [])) cancela al ejecutar la última ecuación de copia. La lista ps que resulta de hacer map copia as va a ser vacía (porque as es vacía) y entonces head ps (que es head []) cancela. Cualquier t;ermino t que contenga el subtérmino A [] va a cancelar.

Saludos,
Alberto.