<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=windows-1252">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Oh, and this may not be appropriate for your particular audience,
      but I definitely like the fact that you can write some algorithms
      extremely elegantly with recursion schemes, viz.<br>
      <br>
    </p>
    <pre><code class="haskell hljs"><p><span class="hljs-keyword">import</span>           Data.Functor.Foldable
<span class="hljs-keyword">import</span>           Data.Ratio            (<span class="hljs-type">Ratio</span>, <span class="hljs-title">denominator</span>, (%))</p><p>isInteger :: (<span class="hljs-type">RealFrac</span> <span class="hljs-title">a</span>) => a -> Bool
<span class="hljs-title">isInteger</span> = idem (realToFrac . floor)
    <span class="hljs-keyword">where</span> idem = ((==) <*>)</p><p>continuedFraction :: (<span class="hljs-type">RealFrac</span> a, <span class="hljs-type">Integral</span> b) => a -> [b]
<span class="hljs-title">continuedFraction</span> = apo coalgebra
    <span class="hljs-keyword">where</span> coalgebra x
              | isInteger x = go $ <span class="hljs-type">Left</span> []
              | otherwise   = go $ <span class="hljs-type">Right</span> alpha
                  <span class="hljs-keyword">where</span> alpha = <span class="hljs-number">1</span> / (x - realToFrac (floor x))
                        go    = <span class="hljs-type">Cons</span> (floor x)</p></code></pre>
    <br>
    <div class="moz-cite-prefix">I wrote up a whole bunch of examples
      here: <a class="moz-txt-link-freetext" href="http://blog.vmchale.com/article/recursion-examples">http://blog.vmchale.com/article/recursion-examples</a><br>
      <br>
      I think such examples are really great because they are things
      which are not possible in Rust (or F#, if I am not mistaken).<br>
      <br>
      On 07/11/2018 07:10 AM, Simon Peyton Jones via Haskell-Cafe wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:AM0PR83MB03082E77516AA35BC5955792AD5A0@AM0PR83MB0308.EURPRD83.prod.outlook.com">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <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-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        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:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:36.0pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:9.0pt;
        font-family:"Courier New";}
span.EmailStyle18
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
.MsoPapDefault
        {mso-style-type:export-only;
        margin-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;}
@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:439761096;
        mso-list-type:hybrid;
        mso-list-template-ids:376759908 134807553 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {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: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><!--[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]-->
      <div class="WordSection1">
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Friends<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">In a few
            weeks I’m giving a talk to a bunch of genomics folk at the
            <a href="https://www.sanger.ac.uk/" moz-do-not-send="true">Sanger
              Institute</a> about Haskell.   They do lots of
            programming, but they aren’t computer scientists.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">I can
            tell them plenty about Haskell, but I’m ill-equipped to
            answer the main question in their minds:
            <i>why should I even care about Haskell</i>?  I’m too much
            of a biased witness.<br>
            <br>
            <o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">So I
            thought I’d ask you for help.  War stories perhaps – how
            using Haskell worked (or didn’t) for you.  But rather than
            talk generalities, I’d love to illustrate with copious
            examples of beautiful code. <o:p></o:p></span></p>
        <ul style="margin-top:0cm" type="disc">
          <li class="MsoListParagraph"
            style="margin-left:0cm;mso-list:l0 level1 lfo1"><span
              style="font-family:"Calibri",sans-serif">Can you
              identify a few lines of Haskell that best characterise
              what you think makes Haskell distinctively worth caring
              about?   Something that gave you an “aha” moment, or that
              feeling of joy when you truly make sense of something for
              the first time.<o:p></o:p></span></li>
        </ul>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">The
            challenge is, of course, that this audience will know no
            Haskell, so muttering about Cartesian Closed Categories
            isn’t going to do it for them.  I need examples that I can
            present in 5 minutes, without needing a long setup.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">To take a
            very basic example, consider Quicksort using list
            comprehensions, compared with its equivalent in C.  It’s so
            short, so obviously right, whereas doing the right thing
            with in-place update in C notoriously prone to fencepost
            errors etc.  But it also makes much less good use of memory,
            and is likely to run slower.  I think I can do that in 5
            minutes.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Another
            thing that I think comes over easily is the ability to
            abstract: generalising sum and product to fold by
            abstracting out a functional argument; generalising at the
            type level by polymorphism, including polymorphism over
            higher-kinded type constructors.   Maybe 8 minutes.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">But you
            will have more and better ideas, and (crucially) ideas that
            are more credibly grounded in the day to day reality of
            writing programs that get work done.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Pointers
            to your favourite blog posts would be another avenue.  (I
            love the Haskell Weekly News.)<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Finally,
            I know that some of you use Haskell specifically for
            genomics work, and maybe some of your insights would be
            particularly relevant for the Sanger audience.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Thank
            you!  Perhaps your responses on this thread (if any) may be
            helpful to more than just me.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-family:"Calibri",sans-serif">Simon<o:p></o:p></span></p>
      </div>
      <!--'"--><br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
Only members subscribed via the mailman list are allowed to post.</pre>
    </blockquote>
  </body>
</html>