<div dir="ltr">Thanks! I'm a Haskell beginner and will relish the opportunity to learn more by studying your code.</div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 7, 2015 at 9:47 AM, Chaddaï Fouché <span dir="ltr"><<a href="mailto:chaddai.fouche@gmail.com" target="_blank">chaddai.fouche@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ooops forgot that Chords are not just lists of Notes :<span class=""><br><br><div>mapNotesMaybe f compo = mapMaybeWithKey go compo<br></div></span><div>  where<br>    go loc chords = mconcat . map (fmap (:[]) . gogo loc) $ chords<br></div>    gogo loc chord@(Chord d notes) = fmap (Chord d) . mconcat . map (fmap (:[]) . f loc chord) $ notes<br></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">Le sam. 7 nov. 2015 à 18:41, Chaddaï Fouché <<a href="mailto:chaddai.fouche@gmail.com" target="_blank">chaddai.fouche@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>This is a bit tricky but mapMaybeWithKey is clearly the tool for the job :<br><br>> mapMaybeWithKey :: (k -> a -> <a href="https://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Maybe.html#t:Maybe" target="_blank">Maybe</a> b) -> <a href="https://hackage.haskell.org/package/containers-0.5.6.3/docs/Data-Map-Lazy.html#t:Map" target="_blank">Map</a> k a -> <a href="https://hackage.haskell.org/package/containers-0.5.6.3/docs/Data-Map-Lazy.html#t:Map" target="_blank">Map</a> k b<br><br></div>So :</div><div dir="ltr"><br><br><div>mapNotesMaybe :: (Loc -> Chord -> Note -> Maybe Note) -> Composition -> Composition<br></div></div><div dir="ltr"><div>mapNotesMaybe f compo = mapMaybeWithKey go compo<br></div><div>  where<br>    go loc chords = mconcat . map (gogo loc) $ chords<br></div><div>    gogo loc chord = mconcat . map (fmap pure . f loc chord) $ chord<br><br></div><div>This should work.<br><br>-- <br></div></div><div dir="ltr"><div>Chaddaï<br></div><br></div><br><div class="gmail_quote"><div dir="ltr">Le sam. 7 nov. 2015 à 07:07, Dennis Raddle <<a href="mailto:dennis.raddle@gmail.com" target="_blank">dennis.raddle@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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. <div><br></div><div>So we have</div><div><br></div><div>data Note = Note ...</div><div>data Chord = Chord ChordSpecificData [Note]</div><div>type Composition = Map Loc [Chord]</div><div><br></div><div>I would like to write a few different functions that operate over all the notes.</div><div><br></div><div>The following function breaks out all the notes, tupling them with the associated Locs and Chords:</div><div>compositionToList :: Composition -> [(Loc,Chord,Note)]</div><div><br></div><div>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.</div><div>mapNotesMaybe :: (Loc -> Chord -> Note -> Maybe Note) -> Composition </div><div>   -> Composition</div><div><br></div><div>Any advice for concise code appreciated.</div><div>Dennis</div><div><br></div><div><br></div><div>What's a concise way of doing this?</div><div><br></div><div>Another useful function would be used for mapping</div><div><br></div><div>Dennis</div><div><br></div></div>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div></blockquote></div>
</div></div><br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br></div>