[Haskell-cafe] Two-iteration optimisation
Andrew Coppin
andrewcoppin at btinternet.com
Wed May 14 14:38:09 EDT 2008
Don Stewart wrote:
> You'd want a general fusion framework for this, and other accumulators,
> that's let's you treat 'f' as a zip of some kind that pulls items from
> its two arguments. And then require only a single rewrite rule for all
> your loop forms.
>
> Stream fusion (see "Lists to Streams to Nothing at All") at least does this for zips,
>
> zip (foldl .. )
> (foldl .. )
>
> Will end up with a single loop, but for an arbitrary 'f' instead of zip,
> seems harder.
>
It seems the thing to do would be to expose a top-level function for
explicitly specifying that this is what you want to do:
foo :: (x' -> y' -> z') -> ([x] -> x') -> ([y] -> y') -> [x] -> [y] -> z'
You could then say
mean xs = foo (/) sum length
which is pretty declarative, and gives the compiler an easy time with
optimising.
Of course, if nobody chooses to *use* this function... it won't help you
any.
More information about the Haskell-Cafe
mailing list