Prueba 2017 Ejercicio 8

Prueba 2017 Ejercicio 8

de Lucas Hernan Bruzzone Rodriguez -
Número de respuestas: 1

Dada la siguiente definicion:
cucu = (curry ◦ curry) ((++"--") ◦ snd ◦ fst)
¿Cual de las siguientes afirmaciones es correcta?

(a) La aplicacion (cucu 8 "b" True) no tipa
(b) La aplicacion (cucu 8 9 10) retorna 8
(c) La aplicacion (uncurry cucu) no tipa
(d) La aplicacion (cucu "a" "b" "c") retorna "b--"

No me queda claro por qué la respuesta correcta es la d)

Muchas gracias

En respuesta a Lucas Hernan Bruzzone Rodriguez

Re: Prueba 2017 Ejercicio 8

de Marcos Viera - InCo -

Analizando el código de:

((++"--") . snd . fst)

Podemos ver que es una función que toma un par, le aplica fst para obtener su primer componente, el cuál a su vez es también un par, al que le aplica snd para obtener su segundo componente, el cual es un String al que se le agrega "--" al final. En resumen, su tipo sería:

((++"--") . snd . fst) :: ((a, [Char]), b) -> [Char]

La función curry toma funciones de tipo (a,b) -> c y las currifica, es decir que las convierte en funciones de tipo a -> b -> c. Es decir que su tipo es:

curry :: ((a, b) -> c) -> a -> b -> c

Te dejo el ejercicio de analizar por qué la composición de curry con curry queda de tipo:

(curry . curry) :: (((a, b), c) -> d) -> a -> b -> c -> d

El resultado es que curry . curry currifica funciones como ((++"--") . snd . fst). Por lo que en la llamada cucu "a" "b" "c" el par que recibiría esa función sería (("a","b"),"c").