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!
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 []).
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.
Alberto.
¿Puedo preguntar por qué la 'c' no es correcta?
Saludos y gracias
Saludos y gracias
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.
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.
Hola,
por qué la d es correcta? No ocurre el mismo proceso si realizo fst (copia (A[]))? O Haskell no procesa las sentencias del let si no es necesario?
por qué la d es correcta? No ocurre el mismo proceso si realizo fst (copia (A[]))? O Haskell no procesa las sentencias del let si no es necesario?