<br>On Wed, Feb 17, 2010 at 16:48, Stephen Tetley wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">

On 17 February 2010 15:41, Mike Dillon &lt;<a href="mailto:mike@embody.org">mike@embody.org</a>&gt; wrote:<br>
&gt; That signature is the `oo` &quot;specs&quot; combinator in Data.Aviary:<br></div></blockquote><div><br>Nice!<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im">
I wouldn&#39;t recommend writing code that depends on Data.Aviary, but<br></div>
some of the combinators are often worth copy/pasting out of it.<br></blockquote></div><br>On the contrary, I think the specs combinators and perhaps others in Data.Aviary (probably not Data.Aviary.*) have potential. We could even generalize oo and the others to categories and add it to Control.Category (which is, after all, looking rather empty).<br>

<br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">import Control.Category<br>import Prelude hiding ((.))<br><br>-- oo :: (c -&gt; d) -&gt; (a -&gt; b -&gt; c) -&gt; a -&gt; b -&gt; d<br>

oo :: (Category cat) =&gt; cat c d -&gt; (a -&gt; cat b c) -&gt; a -&gt; cat b d<br>oo = (.) . (.)<br><br>-- ooo :: (d -&gt; e) -&gt; (a -&gt; b -&gt; c -&gt; d) -&gt; a -&gt; b -&gt; c -&gt; e<br>ooo :: (Category cat) =&gt; cat d e -&gt; (a -&gt; b -&gt; cat c d) -&gt; a -&gt; b -&gt; cat c e<br>

ooo = (.) . (.) . (.)<br><br>-- oooo :: (e -&gt; f) -&gt; (a -&gt; b -&gt; c -&gt; d -&gt; e) -&gt; a -&gt; b -&gt; c -&gt; d -&gt; f<br>oooo :: (Category cat) =&gt; cat e f -&gt; (a -&gt; b -&gt; c -&gt; cat d e) -&gt; a -&gt; b -&gt; c -&gt; cat d f<br>

oooo = (.) . (.) . (.) . (.)<br></blockquote><br>Is it necessary? Maybe not.<br><br>I&#39;m guessing that the names oo, etc. do not have a commonly accepted meaning, so I like them. I&#39;d like to have a module (e.g. Control.Pointfree) containing these and other useful general combinators from the community.<br>

<br>Sean<br>