<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">sorry for the buggy code</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">> let parseOrIgnore p s = either (const s) id $ parse p s</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
> let parseAllOrIgnore = compose . map parseOrIgnore [p1, p2, p3]</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">> parseAllOrIgnore "abbbcccbbba"</div>
<br><div class="gmail_quote">On Fri, Oct 26, 2012 at 2:11 PM, Greg Fitzgerald <span dir="ltr"><<a href="mailto:garious@gmail.com" target="_blank">garious@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hmm, neato. but didn't make life any easier!<div><br></div><div>Data.Monoid> (appEndo . mconcat . map Endo) [(+10), (+20)] 3</div><div>33</div><div>Data.Monoid> (foldr (.) id) [(+10), (+20)] 3</div><div>33</div>
<div><br></div><div>I had hoped for something like:</div><div><br></div><div>> mconcat [(+10), (+20)] 3</div><div><br></div><div>But I suppose that's nonsense, considering this works:</div><div><br></div><div>> mconcat [(++"10"), (++"20")] "3"</div>
<div>"310320"</div><div><br></div><div><br></div><div>I think this is the most general solution?</div><div><br></div><div>import Control.Category</div><div>import Data.Foldable</div><div>import Prelude hiding (foldr, (.), id)</div>
<div><br></div><div>compose :: (Foldable t, Category cat) => t (cat a a) -> cat a a</div><div>compose = foldr (.) id</div><div><br></div><div><br></div><div>Usage:</div><div><br></div><div>> compose [(+10), (+20)] 3</div>
<div><br></div><div>Real-world use case:</div><div><br></div><div>> let parseOrIgnore p = either (const s) id . parse p s</div><div>> parseAllOrIgnore = compose . map parseOrIgnore [p1, p2, p3]</div><div><br></div>
<div>
Naming:</div><div><br></div><div>"(.)/compose" is consistent with "(+)/sum", "(*)/product", "(&&)/and", etc.</div><div><br></div><div>Thoughts?</div><span class="HOEnZb"><font color="#888888"><div>
<br></div><div>-Greg</div></font></span><div class="HOEnZb"><div class="h5">
<div><br></div><br><div class="gmail_quote">On Fri, Oct 26, 2012 at 12:31 PM, John Wiegley <span dir="ltr"><<a href="mailto:jwiegley@gmail.com" target="_blank">jwiegley@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>>>>>> Greg Fitzgerald <<a href="mailto:garious@gmail.com" target="_blank">garious@gmail.com</a>> writes:<br>
<br>
> I've recently found myself using the expression: "foldr (.) id" to compose a<br>
> list (or Foldable) of functions.<br>
<br>
</div>You want the Endo monoid:<br>
<br>
ghci> appEndo (Endo (+ 10) <> Endo (+ 20)) $ 3<br>
33<br>
<span><font color="#888888"><br>
John<br>
</font></span></blockquote></div><br>
</div></div></blockquote></div><br>