[Haskell-cafe] Re: How to make code least strict?
ChrisK
haskell at list.mightyreason.com
Mon Jan 19 12:10:34 EST 2009
Robin Green wrote:
> What guidelines should one follow to make Haskell code least-strict?
Obviously the use of "seq" and bang-patterns make code more strict.
Code is strict when it evaluates values to determine a pattern match. So
avoiding that makes code lazier. Values are evaluated when decisions have to be
make in order to choose what an expression will evaluate to. Avoiding "case"
statements and things that de-sugar to case statements such as "if then else"
and pattern matching. Put off examining the input values. Occasionally the use
of "lazy" patterns, preceded by ~, can help make code both more compact and less
strict.
Consider that the order of pattern matching can matter as well, the simplest
common case being zip:
zip xs [] = []
zip [] ys = []
zip (x:xs) (y:ys) = (x,y) : zip xs ys
The order of the first two lines of zip's definition affects whether
zip [] (error "boom")
or
zip (error "bam") []
will be an error. This shows that "least-strict" is not a unique goal.
For the choice I just made the "zip [] (error "boom")" will cause an error
because the first definition line of zip checks the second argument, while "zip
(error "bam") []" will evaluate to [].
The other way to reduce strictness is to be more polymorphic because this
reduces what can be sensibly done with the arguments.
More information about the Haskell-Cafe
mailing list