[Haskell-cafe] How to implement digital filters using Arrows
capn.freako at gmail.com
Mon Oct 31 16:05:06 CET 2011
Thanks for all your help.
I've been studying your suggested code:
> type FilterAu b c = Automaton (->) b c
> liftAu :: ((x,FilterState s)->(y,FilterState s)) -> FilterState s ->
FilterAu x y
> liftAu f s0 = proc x -> do
> rec (y,s') <- arr f -< (x,s)
> s <- delay s0 -< s'
> returnA -< y
runAutomaton is a bit cumbersome, so define a custom run function that
takes a list
> runAuto a  = 
> runAuto (Automaton f) (x:xs) = let
> (y,a) = f xt
> in y:runAuto a xs
as well as the various instance definitions for Automaton.
I think I understand how the `returnA' in the last line of your
`liftAu' function is getting translated by those instance definitions
c = Automaton ( arr id &&& arr (const c) )
and, furthermore, how that is passing the supplied `y' into the first
element of the resulting couple. However, I don't understand how the
recursively defined `c' is capturing the modified filter state and
preserving it for the next call. It seems like the Automaton being
referred to by `c' is a newly constructed entity, which knows nothing
about the current state of the running Automaton.
Any help in understanding this would be greatly appreciated.
More information about the Haskell-Cafe