
Johann Bach wrote:
I'm wondering if the following problem might reveal a use for Functor or Applicative, or just generally something cooler than I'm doing now.
I have a music document as type MusDoc. It has [Part]. Part has [Note]. I have defined them using field names because I am deliberating allowing for this to get more complicated later.
The question is about mapping functions over the individual parts. I often find myself wanting to alter or filter all the parts. In the following example I define filterDoc with a couple of helper functions. What I would like to know: is there a cooler way to do this using instances of Functor or something? Defining operators?
You could make the types polymorphic to be able to make a functor instance, but it's not necessarily a good idea. In any case, you may want to have a look at functional references http://article.gmane.org/gmane.comp.lang.haskell.cafe/28094 One implementation of functional references is http://hackage.haskell.org/package/data-accessor Then, you can for instance write parts :: Accessor MusDoc [Part] notes :: Accessor Part [Notes] example :: MusDoc -> MusDoc example = modify parts . map . modify notes $ filter (== CSharp) where notes and parts are two appropriate functional references, which are best generated automatically. Regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com