<html 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 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1867208853;
        mso-list-type:hybrid;
        mso-list-template-ids:488827594 -1 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0D8;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style></head><body lang=RU link=blue vlink="#954F72"><div class=WordSection1><ul style='margin-top:0cm' type=disc><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>The advantage of Maybe<span lang=EN-GB> is...</span><o:p></o:p></li></ul><p class=MsoNormal><span lang=EN-GB>This is not advantage of Maybe, but advantage of pattern-matching which allows you to “extract” value only from “Just a” branch and no way to get value from Nothing. But wait, I can get the same exception as in C/C++: fromJust Nothing without “if isJust...”! So, Damien is right here – no difference with C and Haskell is not more safe than C here – and you CAN omit checking and to get run time exception. I’m not sure about SML, may be it does not allow to get value in so dangerous way, but Haskell allows, like C. You will not get warning at compile time even </span><span lang=EN-GB style='font-family:"Segoe UI Emoji",sans-serif'>😊</span><span lang=EN-GB> But in C# 8 you will get warning with such dangerous using of Nullable.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>Common rule is to use pattern-matching. The same technique, sure, is possible in C – you need to wrap value in some structure and to use special functions/macros to extract value, modern C++ libraries already have “option” types.<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>From: </b><a href="mailto:ian@zenhack.net">Ian Denhardt</a><br><b>Sent: </b>18 декабря 2018 г. 21:01<br><b>To: </b><a href="mailto:mattei@oca.eu">Damien Mattei</a>; <a href="mailto:haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br><b>Subject: </b>Re: [Haskell-cafe] (SPAM 3)Re: handling NULL value in database querywith Maybe (or other ...)</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Quoting Damien Mattei (2018-12-18 10:34:15)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> if (x == NULL)</p><p class=MsoNormal>>    printf("NULL\n");</p><p class=MsoNormal>> else</p><p class=MsoNormal>>    printf("%s",*x);</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>C will also allow you to just write:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>    printf("%s", *x);</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Without the if, which will silently compile without complaint, and then</p><p class=MsoNormal>segfault (at best) or corrupt memory at runtime. With Maybe there's no</p><p class=MsoNormal>way to try to access the value if it isn't actually there.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As others have pointed out, your database has a concept of null (to</p><p class=MsoNormal>which the article's complaints are spot on), so somehow you have to</p><p class=MsoNormal>model the fact that it may not actually return a string.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There are more ergonomic ways of dealing with it than having the same</p><p class=MsoNormal>case expression everywhere; other replies suggested using the `maybe`</p><p class=MsoNormal>function to supply a default, or modifying the database schema to say</p><p class=MsoNormal>NOT NULL -- but you have to deal with it somehow. The advantage of Maybe</p><p class=MsoNormal>is:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>* It makes the possibility of no-value explicit, and not something you</p><p class=MsoNormal>  can forget to handle.</p><p class=MsoNormal>* It makes it possible to express that no-value is *not* a possibility,</p><p class=MsoNormal>  when that is the case (by just not using a Maybe).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-Ian</p><p class=MsoNormal>_______________________________________________</p><p class=MsoNormal>Haskell-Cafe mailing list</p><p class=MsoNormal>To (un)subscribe, modify options or view archives go to:</p><p class=MsoNormal>http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</p><p class=MsoNormal>Only members subscribed via the mailman list are allowed to post.</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>