<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body><div style="font-family:Helvetica,Arial;font-size:13px; ">Can you give an example of where the new definitions and current definitions of functor products would yield different behavior?</div><div style="font-family:Helvetica,Arial;font-size:13px; "><br></div><div style="font-family:Helvetica,Arial;font-size:13px; ">-g</div> <br> <div class="gmail_signature"></div> <br><p class="airmail_on">On December 14, 2018 at 12:03:32 AM, David Feuer (<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>) wrote:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>


<title></title>


<div dir="ltr">
<div dir="auto">Currently, we document this law:
<div dir="auto"><br></div>
<div dir="auto">
<div dir="auto">> If defined, some and many should be the least
solutions of the equations:</div>
<div dir="auto">></div>
<div dir="auto">>   some v = (:) <$> v <*>
many v</div>
<div dir="auto">>   many v = some v <|> pure
[]</div>
<div dir="auto"><br></div>
<div dir="auto">This seems a bit too strong. I believe we should
weaken "should be the least solutions of" to "should obey". This
allows non-bottoming implementations for more types. I would be
surprised if the change would meaningfully weaken the value of the
law for reasoning about real programs.</div>
<div dir="auto"><br></div>
<div dir="auto">For example, we currently require</div>
<div dir="auto"><br></div>
<div dir="auto">    some Nothing = Nothing</div>
<div dir="auto">    some (Just x) = _|_</div>
<div dir="auto"><br></div>
<div dir="auto">    many Nothing = Just []</div>
<div dir="auto">    many (Just x) = _|_</div>
<div dir="auto"><br></div>
<div dir="auto">But if we weaken the law, we could instead
use</div>
<div dir="auto"><br></div>
<div dir="auto">    some Nothing = Nothing</div>
<div dir="auto">    some (Just x) = Just (repeat x)</div>
<div dir="auto"><br></div>
<div dir="auto">    many Nothing = Just []</div>
<div dir="auto">    many (Just x) = Just (repeat x)</div>
<div dir="auto"><br></div>
<div dir="auto">This seems strictly, albeit slightly, more
interesting.</div>
<div dir="auto"><br></div>
<div dir="auto">More significantly, I think, the instance for
functor products can also get much better-defined:</div>
<div><br></div>
<div>    some (x :*: y) = some x :*: some y</div>
<div>    many (x :*: y) = many x :*: many y</div>
<div><br></div>
<div>That strikes me as an improvement that may actually be of some
practical value.</div>
</div>
</div>
</div>


_______________________________________________<br>Libraries mailing list<br>Libraries@haskell.org<br>http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries<br></div></div></span></blockquote></body></html>