Ejercicio 8 - Parcial 2018

Re: Ejercicio 8 - Parcial 2018

de Marcos Viera - InCo -
Número de respuestas: 0

La función ((++ "--") . snd . fst) es una composición de funciones que toma un argumento y le hace first, a su resultado le hace snd y a su resultado le hace (++ "--"), es decir que le concatena "--" al final. Por todo esto se puede deducir que el argumento tiene que ser un par (para aplicarle fst), que en su primer componente tenga un par (para aplicarle snd), que a su vez en su segundo componente tenga un String (para hacer el append). Es decir, algo de tipo ((a,String),b). Y Lo que retorna la función compuesta es un String.

Así que  ((++ "--") . snd . fst) :: ((a,String),b) -> String

Que es una instancia del tipo del primer parámetro que recibe (curry . curry), que lo que hace es tomar una función con tipo ((t1,t2),t3) -> t4 y retorna una función de tipo t1 -> t2 -> t3 -> t4, curryficada. Por lo tanto, al aplicar a (curry . curry) la función que recibe un par con otro par, obtenemos la misma función, pero ahora recibiendo los argumentos por separado.

O sea que hacer:

(curry . curry) ((++ "--") . snd . fst) "a" "b" "c"

equivale a hacer 

((++ "--") . snd . fst) (("a", "b"), "c")

==

((++ "--") . snd) ("a", "b")

==

(++ "--")  "b"

==

"b" ++ "--"

==

"b--"