<div dir="auto"><div dir="auto">What about:</div><div dir="auto"><br></div>bisequence :: (Functor f, Bifunctor g) => f (g a b) -> g (f a) (f b)</div><div class="gmail_extra"><br><div class="gmail_quote">On Apr 20, 2017 12:21 PM, "MarLinn" <<a href="mailto:monkleyon@gmail.com">monkleyon@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The question is why does<br>
<br>
```<br>
mzip /= liftM2 (,)<br>
<br>
```<br>
</blockquote>
<br>
I don't have any evidence, but my gut feeling is that indeed mzip == liftM2 (,) == liftA2 (,), but that MonadZip just predates many advances, and that it's not used often enough to warrant changing. Especially because changing stuff in base comes with huge costs and long debates.<br>
<br>
Today I would expect something similar to look somewhat more like this:<br>
<br>
```<br>
class Applicative f => Unzippative f where<br>
    unzipF :: f (a,b) => (f a, f b)<br>
```<br>
<br>
I personally can't remember a single time that function would have come in handy, so I'm happy with Applicative. And I'm projecting that experience onto others and drawing the conclusion of "Meh.".<br>
<br>
But if you find out more after<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
investigating for next 30 minutes<br>
</blockquote>
<br>
I'd be interested to hear. ;)<br>
<br>
Cheers,<br>
MarLinn<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/haskell-caf<wbr>e</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div>