Prueba 2019 Ejercicio 1

Prueba 2019 Ejercicio 1

de Luis Pedro Bonomi Vigil -
Número de respuestas: 3

Hola!

Quería entender por qué la función tiene un tipo más general si la definición no es correcta




Muchas gracias

En respuesta a Luis Pedro Bonomi Vigil

Re: Prueba 2019 Ejercicio 1

de Valentina Pereira Ciaffone -
Hola, no soy profesora, pero creo que tengo la respuesta.
El problema me parece que está en que usaste "False" en lugar de bottom que es lo que representa ese símbolo, que no es simplemente falso, sino que por lo que leí es un valor que no termina de computar. En Haskell una forma de hacer algo como bottom es undefinied, y eso hace que sí compile, y que de el tipo de la solución.
Si lo probas en el ghci obtenés esto:


La información de qué es bottom la miré acá: https://stackoverflow.com/questions/32505911/what-is-the-role-of-bottom-%E2%8A%A5-in-haskell-function-definitions
En respuesta a Valentina Pereira Ciaffone

Re: Prueba 2019 Ejercicio 1

de Alberto Pardo -
Hola,

Es como dice Valentina, no es False lo que tenés que usar sino alguna expresión cuyo valor sea bottom. Bottom es en realidad un valor semántico, no sintáctico, y que denota aquellas expresiones que no terminan o que dan error. Por ejemplo, 1/0 es un caso de error y su valor semántico es bottom. Lo que quiero decir con valor semántico es que los tipos del lenguaje (Bool, Int, Float o los tipos que escriba el programador) se interpretan como un conjunto (con un cierto orden parcial, pero pensemos que es simplemente un conjunto). Luego, cada expresión de un tipo t se interpreta en ese conjunto que representa a t. Por ejemplo, la interpretación de Int es el conjunto Z de los enteros, el conjunto de los reales es la interpretación de Float, etc. Al literal 3 de Haskell le correspondería el entero 3 de Z, etc. Para que ese conjunto denote todas las posibles expresiones de un tipo t hay que agregar que pasa cuando se tiene una expresión e :: t que diverge o da error. Para ello se agrega a cada conjunto de estos que interpretan tipos un valor que se le llama bottom (_|_).

Haskell provee una constante polimórfica undefined :: a cuyo valor es el bottom para todos los tipos. Esta constante simplemente da un error al querer ejecutarla. Uno igual puede construirse expresiones que dan bottom como resultado. Por ejemplo,

f x = f x

Al querer evaluar f v, para cualquier v, esto va a entrar en loop.

En la clase del teórico sobre evaluación perezosa hablamos de ese tema y damos ejemplos de expresiones cuyo valor es bottom.

Saludos,
Alberto.