Ejercicio 8 - Parcial 2018

Ejercicio 8 - Parcial 2018

de Agustina Sierra Lima -
Número de respuestas: 1

Buenas , tengo una duda la letra te da la siguente def.:

cucu= (curry◦curry) ((++"--")◦snd◦fst). Yo llegue a que el tipo es cucu ::a->String->b->String.

Porque curry . curry :: (((a, b), b1) -> c) -> a -> b -> b1 -> c y ((++"--")◦snd◦fst)::((t1,String),t2)->String.

Pero no se cual es la implementacionde de cucu, osea no la entiendo se supone que  ((++"--")◦snd◦fst) es un paramentro de la funcion (curry◦curry) pero no se que hace como para saber que retorna.

No estoy entendiendo la definicion de cucu como es que yo se que hace cucu de "a" "b" "c".

osea cucu "a" "b" "c" = (curry◦curry) ((++"--")◦snd◦fst) "a" "b" "c" . Pero  "a" "b" "c" de quien es parametro ?

Si es un parametro mas de la funcion curry . curry que es lo que pienso , no se que es lo que hace eso.

En respuesta a Agustina Sierra Lima

Re: Ejercicio 8 - Parcial 2018

de Marcos Viera - InCo -

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--"