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.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to