On Mon, Sep 6, 2010 at 12:33 PM, David Menendez <span dir="ltr">&lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On Mon, Sep 6, 2010 at 7:51 AM, John Lato &lt;<a href="mailto:jwlato@gmail.com">jwlato@gmail.com</a>&gt; wrote:<br>
&gt; On Sun, Sep 5, 2010 at 7:18 PM, David Menendez &lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Sun, Sep 5, 2010 at 8:40 AM, John Lato &lt;<a href="mailto:jwlato@gmail.com">jwlato@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Sat, Sep 4, 2010 at 12:34 PM, David Menendez &lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt;<br>
&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Fri, Sep 3, 2010 at 8:23 AM, John Lato &lt;<a href="mailto:jwlato@gmail.com">jwlato@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; +1 for using the proper constraints, and especially for bringing over<br>
&gt;&gt; &gt;&gt; &gt; Pointed (and anything else that applies).<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; What&#39;s the argument for Pointed? Are there many types which are<br>
&gt;&gt; &gt;&gt; instances of Pointed but not Applicative? Are there many algorithms<br>
&gt;&gt; &gt;&gt; which require Pointed but not Applicative?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Having Pointed is categorically the right thing to do, which is why I<br>
&gt;&gt; &gt; argue<br>
&gt;&gt; &gt; for its inclusion.<br>
&gt;&gt;<br>
&gt;&gt; Why is it categorically the right thing to do?<br>
&gt;<br>
&gt; Because it&#39;s the proper abstraction underlying Applicative and Monad, as far<br>
&gt; as I understand category theory.<br>
<br>
</div>What makes it &quot;the proper&quot; abstraction? Applicative Functors have<br>
three parts: the functor, pure, and &lt;*&gt;, along with some equations<br>
they need to satisfy. We know Functor by itself is useful, but what<br>
makes Functor+pure better than Functor+&lt;*&gt; or pure+&lt;*&gt; or any other<br>
subset? The fact that it has a name doesn&#39;t make it useful for<br>
programming; category theory has names for all sorts of things that<br>
don&#39;t come up very often.<br></blockquote><div><br>I&#39;m arguing in favor of pure by itself, not just pure+Functor.  Ivan&#39;s already given one example of a structure that only meets the point criteria: a Bloom filter.<br>
<br>Regarding Applicative Functors somewhat off-topic, you can define fmap strictly in terms of pure+&lt;*&gt;.  It&#39;s interesting that they&#39;re somewhat parallel to non-applicative Functors in that the Functor instance isn&#39;t necessary, it&#39;s the pointed and &lt;*&gt; that are.  Once you have those you get Functor for free.  But a non-applicative functor doesn&#39;t necessarily have either.<br>
<br>Can you give an example of a Functor that doesn&#39;t have pure?  I think it&#39;s Pointed Functors which are useful; not Functor by itself.<br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>
For that matter, can you even describe what pure is intended to do<br>
without reference to &lt;*&gt; or join? You can say that it&#39;s a natural<br>
transformation from Id to f, but so is \x -&gt; [x,x]. You can say it<br>
&quot;contains one copy&quot; of the argument, but that doesn&#39;t work for the<br>
Const functor or the infinite stream functor, among others.<br></blockquote><div><br>Broadly, I agree that pure should behave in a manner consistent with the Applicative or Monad instance if they exist.  In the context of a collections interface though, pure should be identical to singleton, which should guide the choice of Applicative or Monad if there is one.<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
I notice no one has given any algorithms that operate on arbitrary<br>
pointed functors.<br></blockquote><div><br>Ivan gave one useful data structure for which point by itself has meaning but Applicative doesn&#39;t.  Also Point would be a useful base class for a non-empty data API (for which Monoid is unusable).<br>
 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im"><br>
&gt;&gt; When Conor McBride was promoting the use of Applicative (then called<br>
&gt;&gt; Idiom), he provided several instances and algorithms showing that it<br>
&gt;&gt; was a useful generalization of Monad, and it still took several years<br>
&gt;&gt; and a few papers[1] before Applicative found its way into the standard<br>
&gt;&gt; library.<br>
&gt;&gt;<br>
&gt;&gt; In other words, we didn&#39;t add Applicative and then discover<br>
&gt;&gt; Traversable later. Traversable was a big part of the argument for why<br>
&gt;&gt; Applicative is useful.<br>
&gt;<br>
&gt; I take this in favor of my point.  Applicative wasn&#39;t considered useful, so<br>
&gt; it wasn&#39;t included.  Then Conor McBride shows that it is useful, but at that<br>
&gt; point it was too late and now we&#39;re stuck with pure, return, ap, liftA2,<br>
&gt; liftM2, etc.<br>
<br>
</div>I think that has more to do with Haskell 98 compatibility. We broke<br>
Category out of Arrow not too long ago.<br></blockquote><div><br>What was Category doing in Arrow to begin with?  Wouldn&#39;t it have been easier if they had been separate from the start?  Why do you think we should do the same thing now?<br>
 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Furthermore, you didn&#39;t address my point: Applicative is *useful*. We<br>
have algorithms that are parameterized by arbitrary applicative<br>
functors. We have multiple examples of useful non-monad applicative<br>
functors. What are pointed functors good for?<br></blockquote><div><br>Again, I don&#39;t care so much for pointed functors as for Pointed, and I&#39;ve given two examples of where it would be useful.  What&#39;s wrong with breaking Pointed off?  All it requires is one instance with one method which you would have written anyway.  That&#39;s one extra LOC, and if you base Monad and Applicative off of it there&#39;s zero change.  Also a clear separation of concerns is better than conflating meanings together.<br>
<br>John<br><br></div></div>