'any' and 'all' compared with the rest of the Report

Sven Panne [email protected]
Tue, 23 Jan 2001 23:10:53 +0100


Iavor Diatchki wrote:
> [...] but in practise programs run slower.

If "practise" = "simple interpreter", yes. But...

> this is where i would expect a good compiler to do some optimisation,
> i.e to remove the need for the intermediate list.

<TotallyUnbiasedAd>
   Given

      or = foldr (||) False
      any p = or . map p

   ghc -O generates basically the following code (use -ddump-simpl to
see this):

      any :: (a -> Bool) -> [a] -> Bool
      any p xs = let go ys = case ys of
                                (z:zs) -> case p z of
                                             False -> go zs
                                             True  -> True
                 in go xs

   This is exactly the recursive version, without any intermediate list,
   but I hardly think that anybody recognizes this with a quick glance
only.
</ToTallyUnbiasedAd>
 
> i like the idea of programming at a higher level, as i believe it
> produces "better structured" programs.  what i mean is that one
> manages to capture certain aspects of a program, which would
> be obscured if one always used explicit recursion.  i think
> higher order functions like maps and folds really go a long way
> toward structuring functional programs.  in a way this is simillar
> to using loops instead of explicit gotos in procedural programs.
> anyways these are my deep thought on the matter :)

IMHO you should write any kind of recursion over a given data structure
at most once (in a higher order function). (Constructor) classes and
generics are a further step in this direction. It vastly improves
readability (after you get used to it :-) and often there is no
performance
hit at all.

Cheers,
   Sven