[Haskell-cafe] A probably-stupid question about a Prelude implementation.

Bulat Ziganshin bulat.ziganshin at gmail.com
Fri Jun 22 14:28:23 EDT 2007


Hello Michael,

Friday, June 22, 2007, 7:31:17 PM, you wrote:

no surprise - you got a lot of answers :)  it is the best part of
Haskell, after all :)

the secret Haskell weapon is lazy evaluation which makes *everything*
short-circuited. just consider standard (&&) definition:

(&&) False _ = False
(&&) True  x = x

this means that as far as first argument of (&&) is False, we don't
even examine second one. and because everything is lazy evaluated,
this second argument passed as non-evaluated *expression*. if we never
examined it, it will be never evaluated:

Prelude> True && (0 `div` 0>0)
*** Exception: divide by zero
Prelude> False && (0 `div` 0>0)
False

in particular, this allows to create your own control structures. and
another example is that you found: infinite list may be processed as
far as you may calculate result using only finite part of list:

Prelude> take 10 [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> and (cycle [True, False])
False

in particular, last example calculated as

True && False && ...

where "..." remains uncalculated because we find final answer after
examining second list element. i suggest you to use textual
substitution to see how the last "and" call are translated into this
sequence of "&&" applications. this substitution is real process of
evaluating haskell code, it is called "graph reduction" by scientists :)

-- 
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com



More information about the Haskell-Cafe mailing list