The $ operator is used to avoid parentheses. Anything appearing after it will take precedence over anything that comes before.
Sample.hs
{-# LANGUAGE BangPatterns #-}
myMap :: (Integer -> Integer) -> [Integer] -> [Integer]
myMap fun [] = []
myMap fun (x:xs) = (fun x) : myMap fun xs
-- Double an element
doubleMe :: Integer -> Integer
doubleMe x = x*x
-- Return sum of elements of a list
addition :: [Integer] -> Integer
addition xs = addition' xs 0
addition' :: [Integer] -> Integer -> Integer
addition' [] !result= result
addition' (x:xs) !result = addition' (xs) (result+x)
Suppose, you want to calculate the sum of all elments of a list, after doubling every element. You may call ‘addition Mymap Doubleme [1, 2, 3, 4]’.
addition myMap doubleMe [1, 2, 3, 4]
Problem with above statement is, since function takes precedence over all other things in Haskell, addition takes myMap as argument, which is not acceptable, so you will get following error.
*Main> addition myMap doubleMe [1, 2, 3, 4]
<interactive>:11:1:
Couldn't match expected type ‘(Integer -> Integer)
-> [Integer] -> t’
with actual type ‘Integer’
Relevant bindings include it :: t (bound at <interactive>:11:1)
The function ‘addition’ is applied to three arguments,
but its type ‘[Integer] -> Integer’ has only one
In the expression: addition myMap doubleMe [1, 2, 3, 4]
In an equation for ‘it’:
it = addition myMap doubleMe [1, 2, 3, ....]
<interactive>:11:10:
Couldn't match expected type ‘[Integer]’
with actual type ‘(Integer -> Integer) -> [Integer] -> [Integer]’
Probable cause: ‘myMap’ is applied to too few arguments
In the first argument of ‘addition’, namely ‘myMap’
In the expression: addition myMap doubleMe [1, 2, 3, 4]
One way to solve above problem is by using paranthesis.
*Main> addition (myMap doubleMe [1, 2, 3, 4])
30
You can rewrite the same thing is ‘$’ operator like below.
This post first appeared on Java Tutorial : Blog To Learn Java Programming, please read the originial post: here