<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
 <channel>
  <title>Posts tagged "Haskell"</title>
  <description>Posts tagged "Haskell"</description>
  <link>https://www.greghendershott.com/tags/Haskell.rss.xml</link>
  <atom:link href="https://www.greghendershott.com/tags/Haskell.rss.xml" rel="self" type="application/rss+xml"></atom:link>
  <lastBuildDate>Mon, 03 Nov 2014 15:51:21 UT</lastBuildDate>
  <pubDate>Mon, 03 Nov 2014 15:51:21 UT</pubDate>
  <ttl>1800</ttl>
  <item>
   <title>Hands-on with Haskell week 1</title>
   <link>https://www.greghendershott.com/2014/11/hands-on-with-haskell.html</link>
   <guid isPermaLink="false">urn:www-greghendershott-com:-2014-11-hands-on-with-haskell.html</guid>
   <pubDate>Mon, 03 Nov 2014 15:51:21 UT</pubDate>
   <dc:creator>Greg Hendershott</dc:creator>
   <description>
&lt;div&gt;
 &lt;article&gt;
  &lt;header&gt;
   &lt;h1&gt;Hands-on with Haskell week 1&lt;/h1&gt;
   &lt;p class="date-and-tags"&gt;
    &lt;time datetime="2014-11-03" pubdate="true"&gt;2014-11-03&lt;/time&gt; :: &lt;span class="tags"&gt;&lt;a href="/tags/Haskell.html"&gt;Haskell&lt;/a&gt;, &lt;a href="/tags/Hacker-School.html"&gt;Hacker School&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/header&gt;
  &lt;p&gt;Last week I decided to pivot from Clojure hands-on to Haskell hands-on.&lt;/p&gt;&lt;!-- more--&gt;
  &lt;h1 id="rewiring-brain-from-lisp-to-haskell"&gt;Rewiring brain from Lisp to Haskell&lt;/h1&gt;
  &lt;p&gt;Prior to this, I had spent some time working through examples in &lt;a href="http://learnyouahaskell.com/"&gt;Learn You a Haskell&lt;/a&gt; and armchair browsing &lt;a href="http://book.realworldhaskell.org/"&gt;Real World Haskell&lt;/a&gt;. Also I&amp;rsquo;d spent some time using Typed Racket and was already sold on the benefits of having a &amp;ldquo;real&amp;rdquo; type system, especially for certain sorts of programs. So this wasn&amp;rsquo;t starting from scratch. However I soon discovered there were some things about Haskell that I&amp;rsquo;d forgotten and needed to re-learn. Also I suffered from a Lisp brain configuration.&lt;/p&gt;
  &lt;h2 id="sections"&gt;Sections&lt;/h2&gt;
  &lt;p&gt;One example was sections. On Zulip I saw a code fragment like this:&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;primes&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rem&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;takeWhile&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;primes&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;With the comment that the &lt;code&gt;(&amp;lt;= i)&lt;/code&gt; was equivalent to &lt;code&gt;(\j -&amp;gt; (j &amp;lt;= i))&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Wait. Why not &lt;code&gt;(\j -&amp;gt; (i &amp;lt;= j))&lt;/code&gt;?&lt;/p&gt;
  &lt;p&gt;The answer is that a section behaves differently when used with an infix operator. The argument is applied on the missing side. In other words &lt;code&gt;(/ 10)&lt;/code&gt; and &lt;code&gt;(10 /)&lt;/code&gt; are different.&lt;/p&gt;
  &lt;p&gt;So &lt;code&gt;(&amp;lt; 1) 2&lt;/code&gt; is &lt;code&gt;False&lt;/code&gt; but &lt;code&gt;(1 &amp;lt;) 2&lt;/code&gt; is &lt;code&gt;True&lt;/code&gt;. And &lt;code&gt;(compare 1) 2&lt;/code&gt; is &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;In Haskell it&amp;rsquo;s &lt;em&gt;not&lt;/em&gt; the case that &lt;code&gt;(&amp;lt; 1)&lt;/code&gt; is &lt;code&gt;1&lt;/code&gt; partially applied to the &lt;code&gt;&amp;lt;&lt;/code&gt; function, waiting to take a &amp;ldquo;right&amp;rdquo; argument.&lt;sup&gt;&lt;a href="#hands-on-with-haskell-footnote-1-definition" name="hands-on-with-haskell-footnote-1-return"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
  &lt;h2 id="commas"&gt;Commas&lt;/h2&gt;
  &lt;p&gt;In working through &lt;a href="http://learnyouahaskell.com/"&gt;Learn You a Haskell&lt;/a&gt; I wanted to make an example input to try with &lt;code&gt;nub&lt;/code&gt;. I wanted a long list containing duplicates, that I didn&amp;rsquo;t have to type in by hand. To do so I wanted to do a Racket &lt;code&gt;flatten&lt;/code&gt; of a Haskell &lt;code&gt;replicate&lt;/code&gt; of a short list. It seemed like &lt;code&gt;foldr1&lt;/code&gt; with &lt;code&gt;++&lt;/code&gt; would be the way to do the &lt;code&gt;flatten&lt;/code&gt;. So I tried something like:&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;interactive&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;
    &lt;span class="kt"&gt;Couldn&amp;#39;t&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;`[&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;
                &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&amp;#39;&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;, namely `foldr&lt;/span&gt;&lt;span class="sc"&gt;1&amp;#39;&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;equation&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;it&amp;#39;&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;Oops. Let&amp;rsquo;s try something simpler, first.&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;interactive&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="mi"&gt;245&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;
    &lt;span class="kt"&gt;Couldn&amp;#39;t&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;`[&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;
                &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a1&amp;#39;&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;, namely `foldr&lt;/span&gt;&lt;span class="sc"&gt;1&amp;#39;&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;equation&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;it&amp;#39;&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;Huh. Oh right. The &lt;code&gt;++&lt;/code&gt; is infix. Needs to go in parens. Try again:&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;interactive&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="mi"&gt;246&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;
    &lt;span class="kt"&gt;The&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="p"&gt;`[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt; is applied to one argument,&lt;/span&gt;
    &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;its&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;`[&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt; has none&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;foldr1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namely&lt;/span&gt; &lt;span class="p"&gt;`[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&lt;/span&gt;
    &lt;span class="kt"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;Bzzzt. Tried to decipher the error message. Finally remembered, dang, I need to separate list items with commas:&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;OK. And building back up again to what I&amp;rsquo;d wanted originally:&lt;/p&gt;
  &lt;div class="brush: hs"&gt;
   &lt;table class="sourcetable"&gt;
    &lt;tbody&gt;
     &lt;tr&gt;
      &lt;td class="linenos"&gt;
       &lt;div class="linenodiv"&gt;
        &lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
      &lt;td class="code"&gt;
       &lt;div class="source"&gt;
        &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nub&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;foldr1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
  &lt;p&gt;In Lisps I&amp;rsquo;ve grown accustomed to &amp;mdash; and really love &amp;mdash; being able to separate list items with whitespace. Needing to use commas feels a bit weird. Also it&amp;rsquo;s a bit weird that you only use them for things like lists and tuples, but not in function applications. Oh well.&lt;/p&gt;
  &lt;h2 id="other-tiny-things"&gt;Other tiny things&lt;/h2&gt;
  &lt;ul&gt;
   &lt;li&gt;
    &lt;p&gt;I keep making the mistake of typing &lt;code&gt;data MyType = _&lt;/code&gt; instead of  &lt;code&gt;data MyType = MyType _&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
   &lt;li&gt;
    &lt;p&gt;Racket &lt;code&gt;struct&lt;/code&gt;s define accessor functions prefixed with the name of  the struct. So &lt;code&gt;(struct person (name))&lt;/code&gt; defines a &lt;code&gt;person-name&lt;/code&gt;  accessor function. In Haskell, &lt;code&gt;data Person = Person {name ::
  String}&lt;/code&gt; defines an accessor &lt;code&gt;name&lt;/code&gt; &amp;mdash; no prefix. Problem being,  what if you have a couple types that have fields called &lt;code&gt;name&lt;/code&gt;? I  guess you have to do prefix the field names explicitly yourself,  e.g. &lt;code&gt;data Person = Person {personName :: String}&lt;/code&gt;?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
  &lt;p&gt;None of these observations are intended as a critique of Haskell. It&amp;rsquo;s an observation how the tiny things can trip you up when learning a new language. Even after a couple days, I&amp;rsquo;ve developed a sort of subconscious checklist of rookie mistakes to consider before trying to understand the Haskell error message.&lt;/p&gt;
  &lt;h1 id="nice-things"&gt;Nice things&lt;/h1&gt;
  &lt;ul&gt;
   &lt;li&gt;
    &lt;p&gt;I like how creating a simple Haskell &amp;ldquo;project&amp;rdquo; (just for local use)  is as simple as creating a &lt;code&gt;.hs&lt;/code&gt; file. I also like this in Racket.&lt;/p&gt;&lt;/li&gt;
   &lt;li&gt;
    &lt;p&gt;I like having an actual, mature module system with clear best  practices (as in Racket).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
  &lt;h1 id="my-first-hands-on-with-cabal"&gt;My first hands-on with Cabal&lt;/h1&gt;
  &lt;p&gt;I used Cabal for the first time, to install Pandoc. This took&amp;hellip; awhile. Finally I got a weird version error:&lt;/p&gt;
  &lt;pre&gt;&lt;code&gt;Configuring pandoc-1.13.1...
setup: At least the following dependencies are missing:
http-client &amp;gt;=0.3.2 &amp;amp;&amp;amp; &amp;lt;0.4 &amp;amp;&amp;amp; ==0.4.2.2
Updating documentation index /Users/greg/Library/Haskell/doc/index.html
cabal: Error: some packages failed to install:
pandoc-1.13.1 failed during the configure step. The exception was:
ExitFailure 1&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;After puzzling this over for awhile, and reading up on Cabal versioning, I didn&amp;rsquo;t have any great ideas. Finally I decided to try running &lt;code&gt;cabal install pandoc&lt;/code&gt; a second time. And this time, it worked. Shrug. Onward.&lt;/p&gt;
  &lt;h1 id="porting-wffi-to-haskell"&gt;Porting wffi to Haskell&lt;/h1&gt;
  &lt;p&gt;So after some &amp;ldquo;warm-up&amp;rdquo; I decided to dive in and try to port wffi to Haskell. This turned out to be a good-sized project when I was hands-on with Clojure &amp;mdash; not too small, not too big. Implementing it requires parsing markdown, parsing HTTP request templates, making HTTP requests, using higher-order functions, and so on.&lt;/p&gt;
  &lt;p&gt;I forged ahead and got the wffi port of Haskell working to the point that I could successfully make a request to &lt;a href="http://horseebooksipsum.com/"&gt;http://horseebooksipsum.com/&lt;/a&gt;. I had a little confusion at first about how &lt;code&gt;HTTP.Network.simpleHTTP&lt;/code&gt; returns &lt;code&gt;IO (Either String
String)&lt;/code&gt;. Basically, I didn&amp;rsquo;t anticipate where the IO vs. pure &amp;ldquo;boundary&amp;rdquo; would need to be in my program. But once I realized that, it made sense and was easy to sort out.&lt;/p&gt;
  &lt;p&gt;I pushed my commits to a GitHub public &lt;a href="https://github.com/greghendershott/haskell-wffi"&gt;repo&lt;/a&gt;, even though I&amp;rsquo;m sure the code smells pretty badly. My normal instinct is to spend more time with code &amp;mdash; beyond the &amp;ldquo;it&amp;rsquo;s amazing that the dancing bear dances at all&amp;rdquo; stage &amp;mdash; before pushing to public. But I&amp;rsquo;m at Hacker School, this isn&amp;rsquo;t professional coding, and I shouldn&amp;rsquo;t be so cautious. In fact, by pushing early, I could get some feedback.&lt;/p&gt;
  &lt;h2 id="surprisingly-easy"&gt;Surprisingly easy&lt;/h2&gt;
  &lt;p&gt;I was surprised by how quickly the port to Haskell went, compared to the port to Clojure. I would have guessed the opposite, because Clojure seems like it would be &amp;ldquo;closer to&amp;rdquo; Racket. I think there are two reasons why it was faster.&lt;/p&gt;
  &lt;p&gt;One is that I hadn&amp;rsquo;t worked on wffi for a year, so part of the Clojure port was actually reminding myself how things worked. In other words I&amp;rsquo;ve been &amp;ldquo;practicing&amp;rdquo; porting wffi, and the Haskell port got the benefit of that.&lt;/p&gt;
  &lt;p&gt;But also, I simply found Haskell easier to use than I expected. Sure, I frequently alternated between 10 minutes of smooth sailing and 5 minutes of trying to decipher a type error message. However, this felt different from being stalled on a Clojure build/environment/package issue. The Haskell type error messages felt like they turned out to be useful information about my reasoning about my program. Resolving them was sometimes a matter of fixing a simple mistake. Sometimes it entailed fixing a problem with my thinking and my design.&lt;sup&gt;&lt;a href="#hands-on-with-haskell-footnote-2-definition" name="hands-on-with-haskell-footnote-2-return"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
  &lt;p&gt;My early days with Haskell have been more satisfying than those with Clojure. Whether that continues remains to be seen. So far so good.&lt;/p&gt;
  &lt;div class="footnotes"&gt;
   &lt;ol&gt;
    &lt;li id="hands-on-with-haskell-footnote-1-definition" class="footnote-definition"&gt;
     &lt;p&gt;It&amp;rsquo;s also not the case in Racket or Clojure. You&amp;rsquo;d have to say &lt;code&gt;(curry &amp;lt; 1)&lt;/code&gt; or &lt;code&gt;(partial &amp;lt; 1)&lt;/code&gt;. But &lt;em&gt;if&lt;/em&gt; those languages did automatic partial application, it would look like &lt;code&gt;(&amp;lt; 1)&lt;/code&gt;. At least that&amp;rsquo;s what my Lisp brain misunderstood at first.&amp;nbsp;&lt;a href="#hands-on-with-haskell-footnote-1-return"&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
    &lt;li id="hands-on-with-haskell-footnote-2-definition" class="footnote-definition"&gt;
     &lt;p&gt;This is an experience I also had with Typed Racket.&amp;nbsp;&lt;a href="#hands-on-with-haskell-footnote-2-return"&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
  &lt;footer&gt;&lt;/footer&gt;&lt;/article&gt;&lt;/div&gt;</description></item></channel></rss>
