<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Have you looked at Richard Bird's "Thinking Functionally"?<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 18 Dec 2020 at 11:53, Carette, Jacques <<a href="mailto:carette@mcmaster.ca">carette@mcmaster.ca</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div style="overflow-wrap: break-word;" lang="EN-CA">
<div class="gmail-m_5039356662731615194WordSection1">
<p class="MsoNormal"><span>Excellent question. I am not focused on any project/applications in particular. I do have a personal bias towards “languages” and processing of them. Haskell really excels at that. I’m getting the
students in my *<b>grad</b>* class (on generative programming) to do partial evaluators using finally tagless the way “it should have been done” in the paper, if we’d been all-knowing 10 years ago
</span><span style="font-family:"Segoe UI Emoji",sans-serif">😉</span><span> . I don’t think we’ll get to that in the undergrad class. Maybe as bonus questions.<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>Thanks for the timely reminder to try extra-hard to put all the features in context. My background being Pure Math (long ago), that sometimes leads me to forget that abstraction for abstraction’s
sake isn’t everyone’s cup of tea!<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>Certainly things like you mention are excellent topics that fits well with the kinds of programs that I like to write, and that Haskell is fairly well suited for (I’m become an Agda fanboy, so it
feels like I’m really slumming it by coding in Haskell, even worse when I’m working in my metaocaml code base).<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<div style="border-color:currentcolor currentcolor currentcolor blue;border-style:none none none solid;border-width:medium medium medium 1.5pt;padding:0cm 0cm 0cm 4pt">
<div>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Tikhon Jelvis <<a href="mailto:tikhon@jelv.is" target="_blank">tikhon@jelv.is</a>>
<br>
<b>Sent:</b> December 16, 2020 10:42 PM<br>
<b>To:</b> Carette, Jacques <<a href="mailto:carette@mcmaster.ca" target="_blank">carette@mcmaster.ca</a>><br>
<b>Cc:</b> haskell-cafe <<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>><br>
<b>Subject:</b> Re: [Haskell-cafe] Intermediate Modern Haskell<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">What kind of projects and applications are you focused on? In my experience, the difficulty in learning—and teaching—"advanced" Haskell topics is less in the topic itself and more in the level of abstraction involved. I know that I struggled
with GADTs and even existential types not because of the features themselves but because I had real trouble putting the features into context and understanding how I would use them. Just *why* are those abstractions in particular interesting?<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I can recommend some of my personal favorite topics like streaming libraries, FRP, automatic differentiation and the probability monad, but whether that recommendation makes sense depends on how you want to use those topics. Alternatively,
if you have some specific things you would want to build with the class, we could suggest topics that fit those goals.<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Wed, Dec 16, 2020, 19:22 Jacques Carette <<a href="mailto:carette@mcmaster.ca" target="_blank">carette@mcmaster.ca</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p>I will be teaching a second Haskell course next semester. Let's assume that<u></u><u></u></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Introducing functional programming<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Getting started with Haskell and GHCi<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Basic types and definitions<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Designing and writing programs<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Data types, tuples and lists<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Programming with lists<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Defining functions over lists<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Playing the game: I/O in Haskell<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Reasoning about programs<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Generalization: patterns of computation<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Higher-order functions<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Developing higher-order programs<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Overloading, type classes and type checking<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Algebraic types<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)"><u></u> <u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">(i.e. the first chapters of Thompson's Haskell: the Craft of Functional Programming book is "beginner, classic Haskell". The next few chapters, namely<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Abstract data types<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Lazy programming<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Programming with monads<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Domain-Specific Languages<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Time and space behaviour<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)"><u></u> <u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">would be (re)done at the start of such a second course. The question for cafe is: what else? I will likely cover:<br>
- Typeclassopedia<br>
- finally tagless<br>
- Template Haskell<br>
- Optics<br>
- GADTs<br>
- recursion schemes<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)"><u></u> <u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">I should probably cover parser combinators, pretty-printing, cabal&stack. I know that
<a href="http://dev.stephendiehl.com/hask/" target="_blank">http://dev.stephendiehl.com/hask/</a> gives me one heck of a smorgasbord of options, which is kind of a problem.<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)"><u></u> <u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Things I know I will not cover:<br>
- dependent types (if I was going to do that, I'd switch to Idris/Agda)<br>
- concurrency (don't ask)<u></u><u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)"><u></u> <u></u></span></p>
<p style="margin:0cm;line-height:15pt;background:white none repeat scroll 0% 0%;opacity:1;word-spacing:0px">
<span style="font-size:11.5pt;font-family:ArialMT;color:rgb(88,77,77)">Jacques<u></u><u></u></span></p>
</div>
<p class="MsoNormal">_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<u></u><u></u></p>
</blockquote>
</div>
</div>
</div>
</div>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>