Operator anatomy
The application operator $ has the form:
($) :: (a -> b) -> a -> b
This is often seen in situations where you want to avoid a finite pair of brackets:
func a (b + c)
equally:
func a $ b + c
The magic of this is simply explained in the statement of fixation :
infixr 0
This means: everything after $ will be grouped into a single object, as if they were enclosed in parentheses.
Of course, it can also be "nested" as follows:
func a $ b + other $ c - d
which means:
func a (b + other (c - d))
Application Operator as a Function
Your case is very interesting and, in my experience, is not used very often.
Let's analyze this:
map ($ 4) [odd, even]
We know that type map :
map :: (a -> b) -> [a] -> [b]
The behavior, if someone forgot, is as follows: take the first argument (function a to b ) and apply it to all a in the second list of arguments, finally return the resulting list.
You can see ($ 4) as "pass 4 as an argument to something." It means that:
($ 4) func
matches with:
func $ 4
So:
map ($ 4) [odd, even]
means:
[($ 4) odd, ($ 4) even] [(odd $ 4), (even $ 4)] [False, True]
Why (func $) is not required
You can argue that, as you can do (/ 4) and (2 /) , which respectively mean "divide something by 4" and "divide 2 by something", you could do ($ 4) and (func $) and you are right.
Actually:
(func $) 4
matches with:
func $ 4 func 4
which matches with:
($ 4) func
But the reality is this:
map (func $) [...]
would be unnecessary, since the first argument to map always applies to each argument in the list, doing the above:
map func [...]