
Hi Johann A simple metric to help you decide is to ask the question "Do I need type changing?" as that's somewhat the essence of the Functor class. It doesn't look like any of you types are parametric - so thus far you don't need type changing. You could open up your datatypes making them parametric on maybe Note or Pitch. For instance you might decide you want two representations of Pitch: a) Integer for generating MIDI, b) Symbolic for printing - Pitch letters plus octave - C | Cs | Db | D ... As MusicDoc, Part etc must be made parametric to accommodate this, it would be obvious to make them instances of Functor and the related classes Traversable and Foldable which give you nice operations for generic traversals. But if then you want to be parametric on Duration as well, then you have a problem - there aren't common classes for BiFunctor, BiFoldable, BiTraversable... I've represented music myself with a TriFunctor - parametric on Pitch, Duration and Annotation - in practice it wasn't a good way to do it. The other alternative is to use a "generics" library - currently Uniplate is considered the simplest. Generics libraries provide generic traversals of data structures without the restriction to Functor types. Best wishes Stephen