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.
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.
Me sumo a la duda, y además no logro calcular para la parte C, como se llega al False?
Hola, me sumo a la pregunta porque lo ejecute y me da True o es que estoy poniendo algo mal.
gracias, slds
sandra
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
compone :: (t4 -> Bool -> t1) -> ((t1, t2) -> t3) -> t4 -> d -> e
compone :: (t4 -> Bool -> t1) -> ((t1, t2) -> t3) -> t4 -> t2 -> t3
compone :: (a -> Bool -> b) -> ((b, c) -> d) -> a -> c -> d
Derivando llego a False ^ True que no compila.
Gracias
En realidad ese es el operador booleano (&&).
Clarísimo!
Muchas gracias.
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