¿Cómo funciona la aplicación con el operador $ curry en Haskell?

Estoy aprendiendo haskell y estoy un poco confundido acerca de cómo funciona el operador de aplicaciones $ curry.

Según GHC el tipo de $ es

*Main>:t ($)
($) :: (a->b) -> a -> b

Pero puedo escribir el siguiente código

*Main>map ($ 2) [(*2), (+2), (/2)]
[4.0,4.0,1.0]

De acuerdo con la firma de $, aunque supondría que necesitaría usar la función flip porque el primer parámetro de $ es (a-> b)

Por ejemplo, no puedo hacer lo siguiente

curry_test :: Integer -> String -> String
curry_test x y = (show x) ++ " " ++ y
*Main> let x = curry_test "123"
    Couldn't match expected type `Integer' with actual type `[Char]'
In the first argument of `curry_test', namely `"123"'
In the expression: curry_test "123"
In an equation for `x': x = curry_test "123"

Pero puedo hacer

let x = curry_test 2

Respuestas a la pregunta(1)

Su respuesta a la pregunta