Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between $ (dollar) and $! (dollar exclamation point)

Tags:

syntax

haskell

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?

like image 526
Jelle Fresen Avatar asked May 07 '10 09:05

Jelle Fresen


2 Answers

($!) 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 x or f $ x, which first start to evaluate the function f, and only compute the argument x if it is needed.

For example succ (1 + 2) will delay the addition 1 + 2 by creating a thunk, and start to evaluate succ first. Only if the argument to succ is needed, will 1 + 2 be 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 + 2 would first compute 3 and then enter the function succ.

Note that it is not always safe to just replace normal function application with strict function application. For example:

ghci> const 1 (error "noo!") 1 ghci> const 1 $! (error "noo!") *** Exception: noo! 
like image 123
Tom Lokhorst Avatar answered Oct 19 '22 17:10

Tom Lokhorst


See the seq function, which forces the evaluation of a value. $! is defined in terms of seq.

This is a blog post which shows some nuances of its use.

like image 38
Francesco Avatar answered Oct 19 '22 18:10

Francesco