[Haskell-beginners] manipulating Map for music application
chaddai.fouche at gmail.com
Sat Nov 7 17:47:47 UTC 2015
Ooops forgot that Chords are not just lists of Notes :
mapNotesMaybe f compo = mapMaybeWithKey go compo
go loc chords = mconcat . map (fmap (:) . gogo loc) $ chords
gogo loc chord@(Chord d notes) = fmap (Chord d) . mconcat . map (fmap
(:) . f loc chord) $ notes
Le sam. 7 nov. 2015 à 18:41, Chaddaï Fouché <chaddai.fouche at gmail.com> a
> This is a bit tricky but mapMaybeWithKey is clearly the tool for the job :
> > mapMaybeWithKey :: (k -> a -> Maybe
> b) -> Map
> k a -> Map
> k b
> So :
> mapNotesMaybe :: (Loc -> Chord -> Note -> Maybe Note) -> Composition ->
> mapNotesMaybe f compo = mapMaybeWithKey go compo
> go loc chords = mconcat . map (gogo loc) $ chords
> gogo loc chord = mconcat . map (fmap pure . f loc chord) $ chord
> This should work.
> Le sam. 7 nov. 2015 à 07:07, Dennis Raddle <dennis.raddle at gmail.com> a
> écrit :
>> I have a Haskell program that computes music compositions. A composition
>> consists of sounds that happen at locations. A location is data type Loc.
>> At each location is a list of chords. A chord is data type Chord. Each
>> chord contains some chord-specific data and a list of notes. A note is data
>> type Note.
>> So we have
>> data Note = Note ...
>> data Chord = Chord ChordSpecificData [Note]
>> type Composition = Map Loc [Chord]
>> I would like to write a few different functions that operate over all the
>> The following function breaks out all the notes, tupling them with the
>> associated Locs and Chords:
>> compositionToList :: Composition -> [(Loc,Chord,Note)]
>> The following function transforms Notes, keeping only the Just results.
>> If a Chord gets all its notes eliminated, that Chord is removed. If a Loc
>> has all its Chords removed, that Loc is removed from the Map.
>> mapNotesMaybe :: (Loc -> Chord -> Note -> Maybe Note) -> Composition
>> -> Composition
>> Any advice for concise code appreciated.
>> What's a concise way of doing this?
>> Another useful function would be used for mapping
>> Beginners mailing list
>> Beginners at haskell.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Beginners