<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">There are many of us who agree with you that this is a disaster.  It could have been avoided in several ways, but this what we got.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Libraries [mailto:libraries-bounces@haskell.org]
<b>On Behalf Of </b>Bart Massey<br>
<b>Sent:</b> 17 February 2016 17:35<br>
<b>To:</b> Henning Thielemann; Ryan Scott<br>
<b>Cc:</b> Haskell Libraries<br>
<b>Subject:</b> Re: Haskell Foldable Wats (Was: Add conspicuously missing Functor instances for tuples)<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">As a less-capable Haskeller, I agree 100%.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The whole point of importing Data.List (either directly or from the Prelude) is to get functions that work on lists. A crucial feature of this is that applying these functions to non-lists should generate type errors, so that I can notice
 that I passed e.g. a tuple where I meant to pass a list. I would be fine with adding Foldable versions of list functions to Data.Foldable: if I want my functions to work on arbitrary Foldables, that's what I would import.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">As someone who spends some time teaching beginners Haskell, this is a disaster. Trying to explain to a beginner why "Data.List.length ('x', 'y')" returns a number instead of failing is bad enough: trying to explain why it returns 1 is hopeless.
 (I'm better off with Python: at least there it has the grace to return 2.) And then I have to explain why "length ('x', 'y', 'z')" returns an utterly incomprehensible type error? No thanks.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I'm recommending SML over Haskell to beginners a lot more these days.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Feb 17, 2016 at 3:02 AM Henning Thielemann <<a href="mailto:lemming@henning-thielemann.de" target="_blank">lemming@henning-thielemann.de</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<p class="MsoNormal" style="margin-left:4.8pt"><br>
On Mon, 18 Jan 2016, Ryan Scott wrote:<br>
<br>
> * The Not-A-Wat in Haskell:<br>
> <a href="https://www.youtube.com/watch?v=87re_yIQMDw" target="_blank">https://www.youtube.com/watch?v=87re_yIQMDw</a><br>
<br>
I see his examples and draw the opposite conclusions. What he presents are<br>
perfect Wats and they have eventually moved Haskell to the MatLab league<br>
where everything is allowed and the programming system accepts almost<br>
everything the programmer enters.<br>
<br>
Sure,<br>
<br>
> length (2,3) = 1<br>
> product (2,3) = 3<br>
> sum (2,3) = 3<br>
> or (True,False) = False<br>
<br>
are all consistent but consistently useless, unintuitive (not only to<br>
novices) and dangerous. There are alternatives: There was no need to<br>
generalize 'Prelude.length' using Foldable. I always opposed to the<br>
argument "put the most general variant to Prelude", because there is no<br>
clear most general variant or there is one like "length :: Length f => f"<br>
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<br>
situation where I could equally choose between lists and pairs. If at all,<br>
I can see value in a special TupleSize class. However, the Length class<br>
proves that the suggestion that the only reasonable result of 'length<br>
(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>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><o:p></o:p></p>
</blockquote>
</div>
</div>
</div>
<br clear="both">
This email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please delete all copies and notify the sender immediately. You may wish to refer to the incorporation details of Standard Chartered PLC, Standard Chartered Bank and their subsidiaries at http://www.standardchartered.com/en/incorporation-details.html<BR>
<BR>
Insofar as this communication contains any market commentary, the market commentary has been prepared by sales and/or trading desk of Standard Chartered Bank or its affiliate. It is not and does not constitute research material, independent research, recommendation or financial advice. Any market commentary is for information purpose only and shall not be relied for any other purpose, and is subject to the relevant disclaimers available at http://wholesalebanking.standardchartered.com/en/utility/Pages/d-mkt.aspx<BR>
<BR>
Insofar as this e-mail contains the term sheet for a proposed transaction, by responding affirmatively to this e-mail, you agree that you have understood the terms and conditions in the attached term sheet and evaluated the merits and risks of the transaction. We may at times also request you to sign on the term sheet to acknowledge in respect of the same.<BR>
<BR>
Please visit http://wholesalebanking.standardchartered.com/en/capabilities/financialmarkets/Pages/doddfrankdisclosures.aspx for important information with respect to derivative products.<BR>
</body>
</html>