[Haskell-cafe] Why is this strict in its arguments?
Neil Mitchell
ndmitchell at gmail.com
Tue Dec 4 17:00:25 EST 2007
Hi
> findAllPath :: (a -> Bool) -> (BTree a) -> [[a]]
> findAllPath pred = g where
> g (Leaf l) | pred l = [[l]]
> g (Branch lf r rt) | pred r = map (r:) $ (findAllPath pred
> lf) ++ (findAllPath pred rt)
> g _ = []
>
> without even using maybe. However, 2 questions remained:
> 1 - why is the first version strict in its arguments?
Because in all call paths findAllPath will call g with its second
argument. g will always evaluate (by pattern matching on) its value
argument.
> 2 - if it really is strict in its arguments, is there any automated
> way to know when a function is strict in its arguments?
Yes, strictness analysis is a very well studied subject -
http://haskell.org/haskellwiki/Research_papers/Compilation#Strictness
. Essentially, an argument is strict if passing _|_ for that value
results in _|_. So to take your example, evaluating:
findAllPath a _|_
g _|_
_|_
Since g tests what value _|_ has, we get bottom.
Thanks
Neil
More information about the Haskell-Cafe
mailing list