<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 13, 2016 at 5:28 PM, Nicola Gigante <span dir="ltr"><<a href="mailto:nicola.gigante@gmail.com" target="_blank">nicola.gigante@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span class=""><br><div><blockquote type="cite"><div>Il giorno 13 feb 2016, alle ore 10:15, Christopher Allen <<a href="mailto:cma@bitemyapp.com" target="_blank">cma@bitemyapp.com</a>> ha scritto:</div><br><div><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>><span style="font-size:12.8px">subtle difference means that you do need to know about this due to how stacks work in GHC. If you use error and then don't also add that constraint yourself to your function, youll only see part of the stack.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">It is unfortunate that the design forces this implementation detail on users trying to apply a plain old function.</span></div><div><span style="font-size:12.8px"><br></span></div><div><br></div><div>I updated my GHC 8.0.1 candidate, got this:</div><div><br></div><div><div>$ ghci</div><div>GHCi, version 8.0.0.20160204:<span> </span><a href="http://www.haskell.org/ghc/" target="_blank">http://www.haskell.org/ghc/</a><span> </span> :? for help</div><div>Loaded GHCi configuration from /home/callen/.ghci</div><div>Prelude> let myList = [1..5 :: Integer]</div><div>Prelude> let myList' = myList ++ undefined</div><div>Prelude> :t myList'</div><div>myList' :: (?callStack::GHC.Stack.Types.CallStack) => [Integer]</div></div><div><br></div><div>><span style="font-size:12.8px"> changed to use constraint kinds and type alias the implicit parameter behind a nicer API.<br></span><br></div><div>Even if this has happened, we're still talking about the fourth chapter which is prior to types, typeclasses, constraints - everything. None of this means anything to a beginner being shown how to use undefined. The book is trying to make sure _anyone_ can learn Haskell, it's not an advanced DSLs book that introduces DataKinds.</div><div><br></div><div>The implementation is leaking all the way to the fourth chapter of a book for complete beginners. Users will not be sympathetic when the implementation elides information because the user failed to speak to the nasal demons in the correct accent.</div></div></div></blockquote><br></div><div><br></div></span><div>Hi Christopher, I’m following your painful experience preparing the book for GHC 8.0,</div><div>and I sympathize with you.</div><div><br></div><div>Just a question: how do you manage the type of simple</div><div>arithmetic expressions like 1 + 1? I mean, the type contains a constraint there.</div><br></div></blockquote><div><br></div><div>Yeah That nails the problem well enough (for me)<br></div><div>I use the 25 year old <a href="http://blog.languager.org/2014/09/pugofer.html">gofer</a> with its simple prelude precisely because Num, Eq, Show etc are too expensive (for me) early in teaching FP<br></div><div>And the simple prelude is the typeclass-free prelude<br></div><div> <br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"> Teaching ‘undefined’ to beginners is not essential. <br></blockquote><div><br></div><div>Not from where I see.<br></div><div>A very basic feature of my teaching is<br></div><div>- "Stories types tell" (also patterns tell) <br></div><div>- Combined with going between values and types<br><br></div><div>eg What is the type of 2? Int<br></div><div>Complementarily<br></div><div>Give something whose type is Int? 2<br><br></div><div>So what is something whose type is a?<br></div></div></div>
</div></div>