You can still use the monadic combinators, with the price of wrapping and unwrapping in case of newtype. <br><br>newtype P a = P {unP :: a -&gt; Bool}<br>liftM2&#39;P :: (Bool -&gt; Bool -&gt; Bool) -&gt; P a -&gt; P a -&gt; P a<br>
liftM2&#39;P† op = (P .) . on (liftM2 op) unP<br><br>paolino<br><br><br><div class="gmail_quote">2012/7/8 SebastiŠn Krynski <span dir="ltr">&lt;<a href="mailto:skrynski@gmail.com" target="_blank">skrynski@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ok , thanks for the answers, I understand now what †liftM2 does.<div>†In this case would it be silly to †use †combinerPred (and maybe a newType †Predicate a = a -&gt; Bool) for the sake of readability or shoud I stick with</div>


<div>a -&gt; Bool †and †liftM2?</div><div><br></div><div>thanks, SebastiŠn</div><div><br></div><div><br></div><div><br><div class="gmail_quote">2012/7/6 Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu" target="_blank">byorgey@seas.upenn.edu</a>&gt;</span><br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>On Fri, Jul 06, 2012 at 03:17:54PM -0300, Felipe Almeida Lessa wrote:<br>
&gt; On Fri, Jul 6, 2012 at 2:11 PM, SebastiŠn Krynski &lt;<a href="mailto:skrynski@gmail.com" target="_blank">skrynski@gmail.com</a>&gt; wrote:<br>
&gt; &gt; As I was using predicates (a -&gt; bool) , it appeared the need for combining<br>
&gt; &gt; them with a boolean operator (bool -&gt; bool -&gt; bool) †in order to get a new<br>
&gt; &gt; predicate<br>
&gt; &gt; combining the previous two. So I wrote my function combinerPred (see code<br>
&gt; &gt; below). While I think this is JUST ok, i&#39;m feeling a monad in the air.<br>
&gt; &gt; †So.. where is the monad?<br>
&gt; &gt;<br>
&gt; &gt; combinerPred :: †(a -&gt; Bool) †-&gt; (a -&gt; Bool) -&gt; (Bool -&gt; Bool -&gt; Bool) -&gt;<br>
&gt; &gt; (a -&gt; Bool)<br>
&gt; &gt; combinerPred pred1 pred2 op = \x -&gt; op (pred1 x) (pred2 x)<br>
&gt;<br>
&gt; That&#39;s the `(-&gt;) a` monad:<br>
&gt;<br>
&gt; † import Control.Applicative<br>
&gt;<br>
&gt; † combinerPred :: †(a -&gt; Bool) †-&gt; (a -&gt; Bool) -&gt; (Bool -&gt; Bool -&gt;<br>
&gt; Bool) -&gt; (a -&gt; Bool)<br>
&gt; † combinerPred pred1 pred2 op = op &lt;$&gt; pred1 &lt;*&gt; pred2<br>
<br>
</div></div>By the way, I find it more natural to make &#39;op&#39; the first argument,<br>
because it is more useful to partially apply combinerPred to an<br>
operation that it is to some predicates. †Also, in that case<br>
combinerPred is simply liftA2:<br>
<br>
† import Control.Applicative<br>
<br>
† combinerPred :: (Bool -&gt; Bool -&gt; Bool) -&gt; (a -&gt; Bool) -&gt; (a -&gt; Bool) -&gt; (a -&gt; Bool)<br>
† combinerPred = liftA2<br>
<span><font color="#888888"><br>
-Brent<br>
</font></span><div><div><br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>