Another fold question

Ralf Laemmel ralf at
Thu Nov 6 14:05:42 EST 2003

Continuing Keith's self-reply ...

the Music type  involves types
other than Music; so it is fair to say that
ultimately you would need generalised folds
extended to the case of *systems* of datatypes
(cf. "Dealing with large bananas"). Imagine
for example getPitches :: Music -> [Pitch].

Even if a function, be it getNotes or otherwise,
investigates patterns in addition to just looking
at arguments obtained by recursive folding, then
this function can be generally turned into a simple
fold. This is the step of going from paramorphisms
to catamorphisms using the infamous tupling
technique that goes back to L. Meertens I think :-).
(I am not sure that this the obvious way to think
of these things.)

Finally, the getNotes function only recurses
into Music but not into the structure of Notes, and so
I would actually prefer to have a return type
[(Pitch,Octave,Duration)] rather than
[Music] just to be sure that I am extracting notes
and not whatever kind of Music.

Need a banana, now :-)


Keith Wansbrough wrote:

>[replying to self, oops]
>Oops, I didn't look closely enough at this line.  As written, this
>*isn't* a fold because it examines the item (Note _ _ _ :: Music)
>directly rather than just looking at its arguments.  But (a) it's
>academic in this case - since none of the arguments are recursive, you
>can just write
>  getNotes (Note p o d) = [Note p o d]

More information about the Haskell-Cafe mailing list