[Haskell-cafe] haskell in online contests

wren ng thornton wren at freegeek.org
Sat Nov 28 21:47:52 EST 2009


vishnu wrote:
> I always thought lazyness was automatic and
> seq made strictness possible.

Laziness is the default, but that doesn't mean it's everywhere. For 
example, every time you do pattern matching you enforce strictness:

     foo (x:xs) = 5
     ==>
     foo _|_ == _|_

However, there's also a way to make patterns lazy:

     foo ~(x:xs) = 5
     ==>
     foo _|_ == 5

The difference here is in how they're compiled/desugared, something like 
this:

     foo (x:xs) = 5
     ==
     foo = \xs' -> case xs' of (x:xs) -> 5


     foo ~(x:xs) = 5
     ==
     foo = \xs' -> let (x:xs) = xs' in 5
     ==
     foo = \xs' -> 5

So writing the "same" function in different ways can enforce different 
strictness behavior.

There are also more substantial algorithmic uses of laziness. One 
example is writing functions in a way that facilitates list fusion or 
on-line consumption of lists, vs writing functions in a way that forces 
more than one cell of the list at a time. Deforestation and garbage 
collection are not laziness, but appropriate uses of laziness can allow 
you to leverage them to improve the performance of your code.

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list