On Fri, 12 Nov 2004 01:10:06 +0900 Koji Nakahara <[EMAIL PROTECTED]> wrote:
> On Thu, 11 Nov 2004 10:49:13 +0100 (MEZ) > Henning Thielemann <[EMAIL PROTECTED]> wrote: > > > The computation sample rate should be propagated through the network as > > follows: > > If in a component of equal sample rate some processors have the same > > fixed sample rate, all uncertain processors must adapt that. > > If some processors have different fixed sample rates this is an error. > > If no processor has a fixed sample rate, the user must provide one > > manually. > > To me this looks very similar to type inference. Is there some mechanism > > in Haskell which supports this programming structure? > > This may not what you are looking for, > but I would simply use Reader Monad or like. I fall on Arrows and come up with the following. I'm not sure this is a proper usage of Arrows, though. I'd appreciate any advices. -- {-# OPTIONS -fglasgow-exts #-} import Control.Arrow import Data.List (intersect) data Rates = Rates [Int] | Any deriving Show data Processor b c = P Rates (Rates -> (b, Stream) -> (c, Stream)) -- test Stream type Stream = String intersectRates Any (Rates xs) = Rates xs intersectRates (Rates xs) (Rates ys) = Rates $ intersect xs ys intersectRates x y = intersectRates y x instance Arrow Processor where arr f = P Any (\r (x, s) -> (f x, s)) (P r0 f0) >>> (P r1 f1) = P (intersectRates r0 r1) (\r -> (f1 r) . (f0 r)) first (P r f) = P r (\r ((x, y), s) -> let (z, s') = f r (x, s) in ((z, y), s')) runProcessor (P r f) a s = f r (a, s) -- test processors processor1 = P (Rates [44100, 48000]) (\r (x, s) -> ((), s ++ show r)) processor2 = P Any (\r (x, s) -> ((),(s ++ show r))) processor3 = P (Rates [48000]) (\r (x, s) -> ((), (s ++ show r))) process = processor1 >>> processor2 >>> processor3 -- Koji Nakahara _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe