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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to