soma :: (Int,Int) -> Int
add :: Int -> (Int -> Int)

soma e add produzem o mesmo resultado final, mas soma recebe os dois argumentos ao mesmo tempo, enquanto add recebe um argumento de cada vez.

As funções que recebem os seus argumentos um de cada vez dizem-se “curried” em honra do matemático Haskell Curry que as estudou.

Funções que recebem mais do que dois argumentos podem ser curried retornando funções aninhadas.

mult :: Int -> (Int -> (Int -> Int))
mult x y z = x * y * z

mult recebe um inteiro x e devolve uma função (mult x), que por sua vez recebe o inteiro y e devolve a função (mult x y), que finalmente recebe o inteiro z e devolve o resultado xyz

Convenções

Para evitar o uso excessivo de parêntesis quando se usam funções curried são adotadas as seguintes convenções :

Int -> Int -> Int -> Int significa Int -> (Int -> (Int -> Int))

mult x y z significa ((mult x) y) z