[Prueba 2016] [Segunda instancia] [Ejercicio 6]

[Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Alejandro Miguel Andriani -
Número de respuestas: 7

Hola,
Estoy teniendo dudas en el procedimiento de inferencia de tipos, por ejemplo en este ejercicio:


¿Cómo sería el procedimiento para inferir el tipo de compone?

Gracias.

En respuesta a Alejandro Miguel Andriani

Re: [Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Veronica Dahiana Bentancor Cedrez -

Me sumo a la duda, y además no logro calcular para la parte C, como se llega al False?

En respuesta a Veronica Dahiana Bentancor Cedrez

Re: [Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Sandra Paganini Fajardo -

Hola, me sumo a la pregunta porque lo ejecute y me da True o es que estoy poniendo algo mal.


gracias, slds

sandra 

En respuesta a Sandra Paganini Fajardo

Re: [Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Marcos Viera - InCo -

Como tenemos cuatro parámetros podemos comenzar con el siguiente tipo y luego ir agregando restricciones:

compone :: a -> b -> c -> d -> e


Sabemos:

curry :: ((t1, t2) -> t3) -> t1 -> t2 -> t3

entonces b = ((t1, t2) -> t3)


uncurry :: (t4 -> t5 -> t6) -> (t4, t5) -> t6

entonces a = (t4 -> t5 -> t6)


también sabemos por la aplicación que

curry g :: t1 -> t2 -> t3

uncurry f :: (t4, t5) -> t6

por la composición también podemos deducir que:

curry g . uncurry f ::  (t4, t5) -> t2 -> t3

y que t1 = t6

de nuevo por la aplicación:

(curry g . uncurry f) (x,True) :: t2 -> t3

y que t4 = c y t5 =Bool

de nuevo la aplicación:

(curry g . uncurry f) (x,True) y :: t3

y que d = t2 y e = t3

Entonces juntando todas esas condiciones:

compone :: a -> b -> c -> d -> e

es

compone :: (t4 -> t5 -> t1) -> ((t1, t2) -> t3) -> c -> d -> e

es

compone :: (t4 -> Bool -> t1) -> ((t1, t2) -> t3) -> t4 -> d -> e

es

compone :: (t4 -> Bool -> t1) -> ((t1, t2) -> t3) -> t4 -> t2 -> t3


pongamos nombres un poco más lindos:

compone :: (a -> Bool -> b) -> ((b, c) -> d) -> a -> c -> d



En respuesta a Marcos Viera - InCo

Re: [Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Emiliano Luna Barreira -
La parte C no sería incorrecta también? 


Derivando llego a False ^ True que no compila.

Gracias

En respuesta a Veronica Dahiana Bentancor Cedrez

Re: [Prueba 2016] [Segunda instancia] [Ejercicio 6]

de Sandra Paganini Fajardo -

Veronica, yo interprete esa parte asi : 


de sustituir en la función compose con los valores de entrada queda: 

  (curry (uncurry (&&)) . curry fst ) (False,True) 2)

de curry fst ) (False,True) 2) obtengo (False,True) 

después me queda curry (uncurry (&&) (False,True))  pero para el curry tenemos curry :: ((a, b) -> c) -> a -> b -> c  pero si no utilizamos el uncurry no podemos aplicar curry , entonces el uncurry lo da vuelta quedando (False,True) (&&).

Y false && true me da False,  de ahi que el resultado sea False. 

Después lo pruebo en haskell por las dudas : 

             Prelude> (compose (curry (uncurry (&&))) fst False 2)

            False

Así lo razone yo, no se si esta bien o si soy clara. Alguien que quiera retrucar? :)  

slds sandra