[Haskell-cafe] What is the role of $!?
dave at zednenem.com
Sun Nov 18 11:32:48 EST 2007
On Nov 18, 2007 9:23 AM, Paul Johnson <paul at cogito.org.uk> wrote:
> Obviously there is a strong correspondance between a thunk and a
> partly-evaluated expression. Hence in most cases the terms "lazy" and
> "non-strict" are synonyms. But not quite. For instance you could
> imagine an evaluation engine on highly parallel hardware that fires off
> sub-expression evaluation eagerly, but then throws away results that are
> not needed.
I've mostly seen "lazy evaluation" used for the strategy where thunks
are only evaluated once.
Consider the function "f x = g x x" and the code "f (a + b)". Because
Haskell is lazy, it only evaluates "a + b" once, even though "f (a +
b)" reduces to "g (a + b) (a + b)".
In Haskell, the only difference between "f (a + b)" and "g (a + b) (a
+ b)" is efficiency, but there are languages that have non-strict
functions and side-effects. In Algol, IIRC, you could define function
parameters to be call-by-name. A function call like "f(inc(y))" would
not evaluate "inc(y)" until f used its parameter, but it would
evaluate it again each time.
The difference between call-by-name and laziness (aka call-by-need) is
analogous to the difference between these monadic functions:
f1 m = m >>= \x -> g x x
f2 m = m >>= \x1 -> m >>= \x2 -> g x1 x2
Dave Menendez <dave at zednenem.com>
More information about the Haskell-Cafe