[Haskell-cafe] What is the role of \$!?

Andrew Coppin andrewcoppin at btinternet.com
Sun Nov 18 05:05:35 EST 2007

PR Stanley wrote:
> Hi
> okay, so \$! is a bit like \$ i.e. the equivalent of putting parentheses
> around the righthand expression. I'm still not sure of the difference
> between \$ and \$!. Maybe it's because I don't understand the meaning of
> "strict application". While we're on the subject, what's meant by
> Haskell being a non-strict language?
> Cheers
> Paul

It simply means in Haskell, if you call a function, that function is not
executed until you try to do something with the result.

"f \$ x + y" is like "f (x + y)". The value of "x + y" will only actually
be calculated if "f" tries to examine its value. For example,

f1 x = 7
f2 x = if x == 0 then 0 else 1

The "f1" function ignores "x" and always returns "7". If you did "f1 \$ x
+ y", then "x + y" would never ever be calculated at all.

However, "f2" looks at "x" to see if it's 0. So if you do "f2 \$ x + y",
the "x + y" part will be calculated.

"f \$! x + y" is just like "f \$ x + y", except that "x + y" will be
calculated *before* "f" is called - regardless of whether "f" does
anything with this data.

The usual reason for doing this is to avoid large unevaluated
expressions accumulating inside a program loop - e.g., if you were
calculating a total, you probably want the "total" variable to actually
contain the total rather than just a big expression like "1 + 2 + 3 +
...", so you could use \$! to force the total to actually be calculated
before starting the next loop [which will be a recursive function call].

Make any sense?

PS. There is a technical distinction between the terms "lazy" and
"non-strict", and also the opposite terms "eger" and "strict". I
couldn't tell you what that is.