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

Reply via email to