
Felipe,
You can write your own plain old functions:
mapChord :: (Note -> Note) -> Chord -> Chord mapChord f (Chord q n) = Chord q (f n)
mapScale :: (Note -> Note) -> Scale -> Scale mapScale f (Scale q n) = Scale q (f n)
You can also create your own type class, if that's convenient for you
class NoteMap a where noteMap :: (Note -> Note) -> a -> a
instance NoteMap Chord where noteMap = mapChord instance NoteMap Scale where noteMap = mapScale
Initially I didn't realize how powerful this approach could be, but once you have noteMap then most of the functions for altering Notes can then be used on the other types, *without* having to make them (the functions I mean) be part of the typeclass definition. This seems obvious but I hadn't really noticed it until now... Thanks a lot, Patrick
HTH, =)
-- Felipe.
-- ===================== Patrick LeBoutillier Rosemère, Québec, Canada