ejercicio 6 prueba 2019

ejercicio 6 prueba 2019

de Julio Carlos Vera Serafino -
Número de respuestas: 3

Hola,

La función foo tiene dos sentencias (o ecuaciones). La primera tiene resultado de tipo Bool, y la segunda de tipo (Bool, Bool). Yo esperaba que no compilara, pero sí compila. Cómo es que puede compilar, arrojando resultados de tipos distintos? 

Gracias,

Julio

En respuesta a Julio Carlos Vera Serafino

Re: ejercicio 6 prueba 2019

de Marcos Viera - InCo -
En realidad no arroja resultados de tipos distintos. Veamos el código:

data C a = C (Bool, a)

foo (C (True, x )) = x
foo (C x ) = (fst x , False)

(cuando aparecen variables de tipos le voy a poner distintos nombres para no confundirlos)
En la primera ecuación podemos deducir que el tipo de foo es C b -> b
En la segunda ecuación podemos deducir que el tipo de foo es C c -> (Bool,Bool)
Si unificamos esos tipo obtenemos las igualdades:
b = c
b = (Bool,Bool)

Entonces el tipo de foo es:
foo :: C (Bool,Bool) -> (Bool,Bool)

saludos
En respuesta a Marcos Viera - InCo

Re: ejercicio 6 prueba 2019

de Julio Carlos Vera Serafino -
Gracias, Marcos.

Voy avanzando, pero todavía no me aclaro.

Lo de la segunda ecuación está clarito.

El problema es con la primera. El tipo que deduce ghci para la primera ecuación es el que decís. Pero no entiendo cómo. Cuando lo miro, a mí me surge que debería ser C (Bool, a) -> a . No me doy cuenta de qué estoy viendo mal.

Gracias,

Julio
En respuesta a Julio Carlos Vera Serafino

Re: ejercicio 6 prueba 2019

de Marcos Viera - InCo -
Dado el tipo:

data C a = C (Bool, a)

Si mirás el constructor recibe un par de tipo (Bool, a). En la pattern de la ecuación ligás x con el segundo componente, que es de tipo a. Esa x es lo que retornás, así que si lo que recibiste es de tipo (C a) retornás algo de tipo a.

saludos