If you use a monad instance for ZipLists as follows:<br><br>instance Monad ZipList where<br>  return x = ZipList $ repeat x<br>  ZipList [] &gt;&gt;= _ = ZipList []<br>  xs &gt;&gt;= f = diagonal $ fmap f xs<br><br>(where diagonal pulls out the diagonal elements of a ziplist of ziplists)<br>
<br>It will satisfy all the monad laws _except_ when the function f (in xs &gt;&gt;= f) returns ziplists of different length depending on the value passed to it. If f always returns lists of the same length, the monad laws should still hold even if the lists are not infinite in length.<br>
<br><br>I have a fixed size list type (<a href="http://github.com/jvranish/FixedList">http://github.com/jvranish/FixedList</a>) that uses an instance like this and it always satisfies the monad laws since the length of the list can be determined from the type so f is forced to always return the same size of list. <br>
<br>I hope that helps things make sense :)<br><br>- Job<br><br><br><br><div class="gmail_quote">On Fri, Oct 30, 2009 at 1:33 PM, Yusaku Hashimoto <span dir="ltr">&lt;<a href="mailto:nonowarn@gmail.com">nonowarn@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thanks for fast replies! Examples you gave explain why all<br>
Applicatives are not Monads to me.<br>
<br>
And I tried to rewrite Bob&#39;s Monad instance for ZipList with (&gt;&gt;=).<br>
<br>
import Control.Applicative<br>
<br>
instance Monad ZipList where<br>
  return = ZipList . return<br>
  (ZipList []) &gt;&gt;= _ = ZipList []<br>
  (ZipList (a:as)) &gt;&gt;= f = zlHead (f a) `zlCons` (ZipList as &gt;&gt;= f)<br>
<br>
zlHead :: ZipList a -&gt; a<br>
zlHead (ZipList (a:_)) = a<br>
zlCons :: a -&gt; ZipList a -&gt; ZipList a<br>
zlCons a (ZipList as) = ZipList $ a:as<br>
zlTail :: ZipList a -&gt; ZipList a<br>
zlTail (ZipList (_:as)) = ZipList as<br>
<br>
I understand if this instance satisfies the laws, we can replace &lt;$&gt;<br>
with `liftM` and &lt;*&gt; and `ap`. And I found a counterexample (correct<br>
me if I&#39;m wrong).<br>
<br>
*Main Control.Monad&gt; getZipList $ (*) &lt;$&gt; ZipList [1,2] &lt;*&gt; ZipList [3,4,5]<br>
[3,8]<br>
*Main Control.Monad&gt; getZipList $ (*) `liftM` ZipList [1,2] `ap` ZipList [3,4,5]<br>
[3,6]<br>
<br>
Cheers,<br>
-~nwn<br>
<div><div></div><div class="h5"><br>
On Sat, Oct 31, 2009 at 2:06 AM, Tom Davie &lt;<a href="mailto:tom.davie@gmail.com">tom.davie@gmail.com</a>&gt; wrote:<br>
&gt; On Fri, Oct 30, 2009 at 5:59 PM, Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com">lrpalmer@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Fri, Oct 30, 2009 at 10:39 AM, Tom Davie &lt;<a href="mailto:tom.davie@gmail.com">tom.davie@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; Of note, there is a sensible monad instance for zip lists which I<br>
&gt;&gt; &gt; *think*<br>
&gt;&gt; &gt; agrees with the Applicative one, I don&#39;t know why they&#39;re not monads:<br>
&gt;&gt; &gt; instance Monad (ZipList a) where<br>
&gt;&gt; &gt;   return = Ziplist . return<br>
&gt;&gt; &gt;   join (ZipList []) = ZipList []<br>
&gt;&gt; &gt;   join (ZipList (a:as)) = zlHead a `zlCons` join (map zlTail as)<br>
&gt;&gt;<br>
&gt;&gt; IIRC, that doesn&#39;t satisfy the associativity law, particularly when<br>
&gt;&gt; you are joining a list of lists of different lengths.  2 minutes of<br>
&gt;&gt; experimenting failed to find me the counterexample though.<br>
&gt;<br>
&gt; Cool, thanks Luke, that explains why this is available in Stream, but not in<br>
&gt; ZipList too.<br>
&gt; Bob<br>
</div></div><div><div></div><div class="h5">&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
&gt;<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>
</div></div></blockquote></div><br>