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