<p dir="ltr">The big problem was the goal of allowing Data.Foldable and Data.Traversable to be imported unqualified. This was fine for Data.Traversable, but not for Data.Foldable. There are relatively few cases where the Traversable generalization is confusing or otherwise problematic, but Foldable is just too "wild".</p>
<p dir="ltr">Once that dubious goal was set, consistency and efficiency demanded some of the other changes.</p>
<div class="gmail_quote">On Feb 17, 2016 6:02 AM, "Henning Thielemann" <<a href="mailto:lemming@henning-thielemann.de">lemming@henning-thielemann.de</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On Mon, 18 Jan 2016, Ryan Scott wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
* The Not-A-Wat in Haskell:<br>
<a href="https://www.youtube.com/watch?v=87re_yIQMDw" rel="noreferrer" target="_blank">https://www.youtube.com/watch?v=87re_yIQMDw</a><br>
</blockquote>
<br>
I see his examples and draw the opposite conclusions. What he presents are perfect Wats and they have eventually moved Haskell to the MatLab league where everything is allowed and the programming system accepts almost everything the programmer enters.<br>
<br>
Sure,<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
length (2,3) = 1<br>
product (2,3) = 3<br>
sum (2,3) = 3<br>
or (True,False) = False<br>
</blockquote>
<br>
are all consistent but consistently useless, unintuitive (not only to novices) and dangerous. There are alternatives: There was no need to generalize 'Prelude.length' using Foldable. I always opposed to the argument "put the most general variant to Prelude", because there is no clear most general variant or there is one like "length :: Length f => f" and you won't like it.<br>
<br>
We could reasonably have the Haskell 98 class<br>
<br>
  class Length a where<br>
     length :: a -> Int<br>
<br>
  instance Length [a] where<br>
     length = List.length<br>
<br>
  instance Length (a,b) where<br>
     length _ = 2<br>
<br>
This would yield the intuitive<br>
  length (2,3) = 2<br>
<br>
I do not propose to implement this class, because I never encountered a situation where I could equally choose between lists and pairs. If at all, I can see value in a special TupleSize class. However, the Length class proves that the suggestion that the only reasonable result of 'length (2,3)' is 1, is plain wrong.<br>
<br>
How did we get there? There were three steps that made this Wat possible:<br>
  1. Foldable.length added<br>
  2. instance Foldable ((,) a)<br>
  3. export Foldable.length from Prelude.<br>
<br>
For me<br>
  1. was correct<br>
  2. was wrong because a programmer should better define a custom type<br>
     like "data AdornedSingleton a b = AS a b"<br>
  3. Was wrong because there are multiple ways to generalize 'length'.<br>
     Without 3. you would have to use explicitly 'length' from Foldable<br>
     and this way you would have been warned, that strange things may happen.<br>
</blockquote></div>