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