[Haskell-cafe] Is lazyness make big difference?

Allan Clark a.d.clark at ed.ac.uk
Thu Feb 15 06:47:01 EST 2007


Nick wrote:
> Hi all,
>
> (Another topic stolen from a Russian forum discussion).
>
> As everyone know, there are lot of strict languages, that have 
> possibilities to "switch on" lazy evaluation when needed.
>
> But the examples that I saw on Haskell, there was not much use of lazy 
> evaluation, often there were just several lazy points, and the rest 
> could be done strictly without loss of generality. For example, in 
> finding primes:
> I think the Haskell solution is more compact due to syntactic sugar, 
> curring and "parentheses-free-ness", *not* lazy evaluation.
>
Hi,
    I think a big advantage is that programs can be written without 
regard for whether or not a value will in the long run actually be 
evaluated.
For me one of the best examples of this is that of logging within a 
compiler.
Consider a compiler which operates roughly as such

compileProgram :: String -> IO ()
compileProgram program =
  let (log, abstract) = parse program
       (log2, typedProgram) = typeCheck abstract log2
       (log3, convertedProgram) = convertToIntermediate typedProgram log2
       (log4, convertedToAssembly) = convertToAssembly convertedProgram log3
  in do writeFile "a.asm" (show convertedToAssembly)
           writeFile "a.log" (show log4)

Now each of the intermediate transforming calls will produce some 
logging information which is added to the current log.
Some of these will require quite heavy traversing of the entire program, 
which will almost certainly require auxiliary functions.
Suppose we want to allow the suppressing of the log information ie:

compileProgram :: String -> Bool -> IO ()
compileProgram program logOrNot =
  let (log, abstract) = parse program
       (log2, typedProgram) = typeCheck abstract log2
       (log3, convertedProgram) = convertToIntermediate typedProgram log2
       (log4, convertedToAssembly) = convertToAssembly convertedProgram log3
  in do writeFile "a.asm" (show convertedToAssembly)
           if logOrNot
           then writeFile "a.log" (show log4)
           else return ()

Now if this is a strict language we have to go and modify all the 
intermediate functions to first of all take in a boolean and then use 
that to decide whether or not to produce any logging information. With a 
lazy language though, we don't need to do that, we're already done, no 
logging information will be produced if 'logOrNot' is false, because it 
will never be forced to evaluate the thunk.

> According to one guy's analogy: the Real World is strict - in order to 
> drink tea, you have to put the cattle on the fire, wait until water 
> boils, brew tea and then drink. Not the cattle is put on the fire, 
> water boils and the tea is brewed when you take the empty cup to start 
> drinking. :-)
>
Yes true, but you don't just boil up the kettle and brew the tea unless 
you have first asked if anyone actually wants tea.

> The question is the following: how big the gap between strict 
> languages with lazy constructs and Haskell? Does the default lazyness 
> have irrefutable advantage over default strictness?
>
> Thank you for the attention.
>
> With best regards,
> Nick.



More information about the Haskell-Cafe mailing list