Can anybody explain the difference in Haskell between the operators ($) and ($!) (dollar sign vs dollar sign exclamation point)?
I haven’t seen the use of $! anywhere so far, but while browsing through the Haskell reference, I noticed its existence and that it has the exact same definition as $. When trying some simple statements in a Haskell interpreter (GHCi), I couldn’t find any difference, nor could I find any reference to the operator in the top listed tutorials when searching for haskell tutorial.
So, just out of curiosity, what is the difference, if at all?
($!)is strict function application. That is, it evaluates the argument before evaluating the function.This is contrary to normal lazy function application in Haskell, e.g.
f xorf $ x, which first start to evaluate the functionf, and only compute the argumentxif it is needed.For example
succ (1 + 2)will delay the addition1 + 2by creating a thunk, and start to evaluatesuccfirst. Only if the argument to succ is needed, will1 + 2be evaluated.However, if you know for sure that the argument to a function will always be needed, you can use
($!), which will first evaluate the argument to weak head normal form, and then enter the function. This way, you don’t create a whole big pile of thunks and this can be more efficient. In this example,succ $! 1 + 2would first compute3and then enter the functionsucc.Note that it is not always safe to just replace normal function application with strict function application. For example: