<div dir="auto">Two more points:<div dir="auto"><br></div><div dir="auto">People have previously considered unusual Foldable instances that this law would prohibit. See for example Petr Pudlák's example instance for Store f a [*]. I don't have a very strong opinion about whether such things should be allowed, but I think it's only fair to mention them.</div><div dir="auto"><br></div><div dir="auto">If the Committee chooses to accept the proposal, I suspect it would be reasonable to add that if the type is also a Functor, then it should be possible to write a Traversable instance compatible with the Functor and Foldable instances. This would subsume the current foldMap f = fold . fmap f law.</div><div dir="auto"><br></div><div dir="auto">[*] <a href="https://stackoverflow.com/a/12896512/1477667">https://stackoverflow.com/a/12896512/1477667</a><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, May 5, 2018, 10:37 PM Edward Kmett <<a href="mailto:ekmett@gmail.com">ekmett@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">I actually don't have any real objection to something like David's version of the law. <div><br></div><div>Unlike the GenericSet version, it at first glance feels like it handles the GADT-based cases without tripping on the cases where the law doesn't apply because it doesn't just doesn't type check. That had been my major objection to Gershom's law.<div><div><br></div><div>-Edward</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, May 5, 2018 at 5:09 PM, David Feuer <span dir="ltr"><<a href="mailto:david.feuer@gmail.com" target="_blank" rel="noreferrer">david.feuer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">I have another idea that might be worth considering. I think it's a lot simpler than yours.<div dir="auto"><br></div><div dir="auto">Law: If t is a Foldable instance, then there must exist:</div><div dir="auto"><br></div><div dir="auto">1. A Traversable instance u and</div><div dir="auto">2. An injective function</div><div dir="auto"> toTrav :: t a -> u a</div><div dir="auto"><br></div><div dir="auto">Such that</div><div dir="auto"><br></div><div dir="auto"> foldMap @t = foldMapDefault . toTrav</div><div dir="auto"><br></div><div dir="auto">I'm pretty sure this gets at the point you're trying to make.</div><div><div class="m_-4446501889732117611h5"><br><div class="gmail_extra" dir="auto"><br><div class="gmail_quote">On May 3, 2018 11:58 AM, "Gershom B" <<a href="mailto:gershomb@gmail.com" target="_blank" rel="noreferrer">gershomb@gmail.com</a>> wrote:<br type="attribution"><blockquote class="m_-4446501889732117611m_7487089496557678815quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This came up before (see the prior thread):<br>
<a href="https://mail.haskell.org/pipermail/libraries/2015-February/024943.html" rel="noreferrer noreferrer noreferrer" target="_blank">https://mail.haskell.org/pipermail/libraries/2015-February/024943.html</a><br>
<br>
The thread at that time grew rather large, and only at the end did I<br>
come up with what I continue to think is a satisfactory formulation of<br>
the law.<br>
<br>
However, at that point nobody really acted to do anything about it.<br>
<br>
I would like to _formally request that the core libraries committee<br>
review_ the final version of the law as proposed, for addition to<br>
Foldable documentation:<br>
<br>
==<br>
Given a fresh newtype GenericSet = GenericSet Integer deriving (Eq,<br>
Ord), where GenericSet is otherwise fully abstract:<br>
<br>
forall (g :: forall a. f a -> Maybe a), (x :: f GenericSet).<br>
maybe True (`Foldable.elem` x) (g x) =/= False<br>
==<br>
<br>
The intuition is: "there is no general way to get an `a` out of `f a`<br>
which cannot be seen by the `Foldable` instance". The use of<br>
`GenericSet` is to handle the case of GADTs, since even parametric<br>
polymorphic functions on them may at given _already known_ types have<br>
specific behaviors.<br>
<br>
This law also works over infinite structures.<br>
<br>
It rules out "obviously wrong" instances and accepts all the instances<br>
we want to that I am aware of.<br>
<br>
My specific motivation for raising this again is that I am rather<br>
tired of people saying "well, Foldable has no laws, and it is in base,<br>
so things without laws are just fine." Foldable does a have a law we<br>
all know to obey. It just has been rather tricky to state. The above<br>
provides a decent way to state it. So we should state it.<br>
<br>
Cheers,<br>
Gershom<br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" rel="noreferrer noreferrer" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div><br></div></div></div></div>
<br>_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank" rel="noreferrer">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
<br></blockquote></div><br></div>
</blockquote></div>