<div dir="auto"><div dir="auto">When you have a MonadPlus instance satisfying the left distribution law [*]:</div><div dir="auto"><br></div><div dir="auto">    (m <|> n) >>= k =  (m >>= k) <|> (n >>= k)</div><div dir="auto"><br></div><div dir="auto">then</div><div dir="auto"><br></div><div dir="auto">    (Just <$> m <|> pure Nothing) >>= k</div><div dir="auto">      = (Just <$> m >>= k) <|> (pure Nothing >>= k)</div><div dir="auto">      = (m >>= k . Just) <|> k Nothing</div><div dir="auto"><br></div><div dir="auto"><div dir="auto" style="font-family:sans-serif">    (pure Nothing <|> Just <$> m) >>= k</div><div dir="auto" style="font-family:sans-serif">      = k Nothing <|> (m >>= k . Just)</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">These look pretty similar, so there's no one obviously correct choice. You could imagine using one to indicate that you prefer to include the optional part, but that you're okay without it, and the other to indicate that you only want to include the optional part if necessary.</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">Suppose, instead, that you have an Alternative instance that satisfies the left catch law:</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">     pure x <|> m = pure x</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">This is very common for parsers that don't backtrack by default, along with types like Maybe and IO. Now</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">    pure Nothing <|> Just <$> m = pure Nothing<br></div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">Oops! That's not useful at all!</div></div><div dir="auto"><br></div><div>Now, let's look at another important practical matter. Lots of real code in the wild uses `optional`. Almost all of this code would break if the semantics were changed. So there is basically no chance that will ever happen. You could make an argument for including the other version too, but I don't yet see a compelling use case.</div><div dir="auto"><br></div><div dir="auto">[*] <a href="https://en.wikibooks.org/wiki/Haskell/Alternative_and_MonadPlus#Other_suggested_laws">https://en.wikibooks.org/wiki/Haskell/Alternative_and_MonadPlus#Other_suggested_laws</a><br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Thu, Sep 5, 2019, 10:10 PM Dannyu NDos <<a href="mailto:ndospark320@gmail.com" rel="noreferrer noreferrer" target="_blank">ndospark320@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>I once used `traverse optional` combined with `catMaybes`. For example:</div><div><br></div>Prelude Control.Applicative Data.Maybe> catMaybes <$> traverse optional [[1,2],[3]]<br><div>[[1,3],[1],[2,3],[2],[3],[]]</div><div><br></div><div>This is totally out of order. I think a more natural output is:</div><div><br></div><div>[[],[3],[1],[1,3],[2],[2,3]]<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2019년 9월 1일 (일) 오후 11:23, Edward Kmett <<a href="mailto:ekmett@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank">ekmett@gmail.com</a>>님이 작성:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">It would also render the combinator useless for its normal purpose.<div><br></div><div>optional is used mostly to try to run a parser and to either succeed with its  result (wrapped in a Just) or _failing that_ to just  return Nothing and carry on.</div><div><br></div><div>For monads like parsec, the first parse is the one that gets returned, so the definition isn't symmetric in behavior.</div><div><br></div><div>-Edward</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Sep 1, 2019 at 2:28 AM Dannyu NDos <<a href="mailto:ndospark320@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank">ndospark320@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">The current 'one or none' definition breaks the order of elements.<div dir="auto"><br></div><div dir="auto">It is more Ord-friendly to define it as 'none or one'.</div></div>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" rel="noreferrer noreferrer noreferrer" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>
</blockquote></div>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" rel="noreferrer noreferrer noreferrer" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div></div></div>