
On Mon, 26 Feb 2007 23:41:14 -0600 (CST), you wrote:
Here's my second attempt at the code: ...
You've left out a bunch of constructors, and there are various other errors here and there. I think this will do what you want:
data ISine = Sine Integer Integer Integer [Char] | MetaSine Integer Integer Integer [ISine]
letter (Sine _ _ _ l) = l sub_sines (MetaSine _ _ _ xs) = xs period (Sine p _ _ _) = p period (MetaSine p _ _ _) = p offset (Sine _ o _ _) = o offset (MetaSine _ o _ _) = o threshold (Sine _ _ t _) = t threshold (MetaSine _ _ t _) = t
on :: Integer -> ISine -> Bool on time iSine = (mod (time-(offset iSine)) (period iSine)) < (threshold iSine)
act :: Integer -> ISine -> [[Char]] act time (MetaSine p o t s) = if on time (MetaSine p o t s) then foldr1 (++) (map (act time) (sub_sines (MetaSine p o t s))) else []
act time (Sine p o t l) = if on time (Sine p o t l) then [letter (Sine p o t l)] else []
But note that you have to write the equations for period, offset and threshold twice. If you want to avoid that, you can move the Sine/MetaSine discrimination into the "tail" of the data structure, something like this:
data ISineTail = SineTail [Char] | MetaTail [ISine]
data ISine = ISine Integer Integer Integer ISineTail
letter (ISine _ _ _ (SineTail l)) = l sub_sines (ISine _ _ _ (MetaTail xs)) = xs period (ISine p _ _ _) = p offset (ISine _ o _ _) = o threshold (ISine _ _ t _) = t
on :: Integer -> ISine -> Bool on time iSine = (mod (time-(offset iSine)) (period iSine)) < (threshold iSine)
act :: Integer -> ISine -> [[Char]] act time (ISine p o t (MetaTail s)) = if on time (ISine p o t (MetaTail s)) then foldr1 (++) (map (act time) (sub_sines (ISine p o t (MetaTail s)))) else []
act time (ISine p o t (SineTail l)) = if on time (ISine p o t (SineTail l)) then [letter (ISine p o t (SineTail l))] else []
Steve Schafer Fenestra Technologies Corp. http://www.fenestra.com/