[Haskell-cafe] Lazy cons, Stream-Fusion style?

Henning Thielemann lemming at henning-thielemann.de
Sun Jan 2 15:48:12 CET 2011


On Sun, 2 Jan 2011, Stephen Tetley wrote:

> Un-optimized, with a head-strict stream (basically Wouter Swierstra's
> Stream with a bang on the element), rendering currently takes minutes
> to generate seconds. But as well as the Stream representation, I've
> plenty of room to optimize the WAV file generation.

Using stream-fusion:Stream rendered to a low-level list representation you 
get relatively efficient computation. I used my signal generator type and 
StorableVector.Lazy in order to perform this one in real-time:
   http://www.youtube.com/watch?v=KA6DE9jlpSY

(see packages synthesizer-core and synthesizer-alsa)

That is, even interactive realtime processing is possible, but not very 
complex one. It requires very disciplined programming and after a small 
change to your program the GHC optimizer may decide to compile it 
completely different and the program becomes five times slower.

I have also written an overview of what data structures are useful for 
what signal processing purpose:
   http://hackage.haskell.org/packages/archive/synthesizer/0.2.0.1/doc/html/Synthesizer-Storage.html

> Probably I can live without definitions like @ ones = 1 <:> ones @, I
> would like to know whether of not this is impossible with
> Stream-Fusion anyway.

The recursive style allows for elegant writing of feedback, solution of 
differential (e.g. oscillation) equations. It's sad, but I think you 
cannot have it with stream-fusion. Maybe in future GHC or JHC get more 
cleverness to eliminate even more lazy values. For feedback with longer 
and constant delay, you might buffer the data in a chunky storable vector 
and then get efficient recursive computation.



More information about the Haskell-Cafe mailing list