[Haskell-cafe] Request for optimizing help.

Johannes Waldmann waldmann at imn.htwk-leipzig.de
Mon Jun 25 08:48:07 CEST 2012

First, why do you think your code is non-optimal?

you don't show your main program, so we don't know what you're measuring.

Just by looking at some types (and not analysing the algorithm):

11 data FilterState a = FilterState {
14   , taps :: [a] -- current delay tap stored values

the "State" really is "taps" only. (as  and  bs don't change ?)
so "taps" should be separate.

25         newTaps = wk : init (taps s)

"init" could be expensive (linear in the list length)
(but you have linear cost elsewhere, so maybe it does not hurt)

Use some different sequence type (instead of list)?
It seems you actually want a strict sequence (while (:) is lazy)
of strict values.

31 runFilter :: Kernel a -> FilterState a -> [a] -> IO ([a], FilterState a)

why IO? there's no IO in the implementation. it looks like a simple fold.

the type is polymorphic, so ghc needs to be able 
to inline the dictionary arguments. (I think that it means that
it wants to "see" all the code when compiling main, but I'm not sure.
Experts can tell by studing  -ddump-simpl  output.)

More information about the Haskell-Cafe mailing list