<div dir="ltr">Replying to a few here.<div><br></div><div>Gigante:</div><div><br></div><div><div style="font-size:12.8px">>Just a question: how do you manage the type of simple <span style="font-size:12.8px">arithmetic expressions like 1 + 1? I mean, the type contains a constraint there.</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">> Prelude> :t 1 + 1</span></div><div style="font-size:12.8px">> 1 + 1 :: Num a => a</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Earlier versions of the book intentionally juked this or concreted the type of numbers to Integer, but HaskellForMac defenestrated that with the always-on type showing so now we've had an explanation along the lines you suggest for a few months now. We know how to adapt - we've tested the book extensively. What we need is the implementation not to expose irrelevant magic/noise in ways that could leak into the first chapter with Haskell code in it.</div><div style="font-size:12.8px"><br></div><div><br></div><div>Seidel:</div><div><br></div><div>><span style="font-size:12.8px">If your readers are using :t they must already know about simple types</span><br style="font-size:12.8px"><span style="font-size:12.8px">like Integer, [], and, ->, so the new things are HasCallStack and =>.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">You'd bloody think as we're careful when we introduce :t, but we get tickets from people using HaskellForMac[1] that get confused because they are shown the types of expressions too early. Now we're careful in how we introduce _any_ expressions.</span></div><div><br></div><div>Fisking your attempt:</div><div><br>><span style="font-size:12.8px"> </span><span style="font-size:12.8px">=> is just like -> except</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">They don't know what either of those things are or what they mean in the second chapter because this is the _first_ chapter with any Haskell code. They're just beginning to see how Haskell code might be kinda like the lambdas in the lambda calculus chapter.</span></div><div><br></div><div><span style="font-size:12.8px">> the compiler fills in the argument by</span></div><div><span style="font-size:12.8px"><br>We do explain what a compiler and interpreter are, but they won't know what it means for it to fill in an argument. They don't know why it needs to fill in an argument. Where did the argument come from?</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">>  HasCallStack tells the compiler</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">How? Why? Why do they need to care? What's a HasCallStack? Keep in mind they don't know types, typeclasses, or anything else.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">></span><span style="font-size:12.8px"> </span><span style="font-size:12.8px">that the expression needs a call-stack</span></div><div><br></div><div>Still don't know what a call, stack, or call-stack are.</div><div><br></div><div><span style="font-size:12.8px">> because it might crash.</span></div><div><br></div><div>Why does that change the type? We can construct bottoms like `let x in x` that crash the program without changing the type.</div><div><br></div><div><span style="font-size:12.8px">> >So HasCallStack => [Integer] is a [Integer]</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">What makes this even more obnoxious is that when we finally do introduce typeclasses and constraints, we talk about constraining a _type variable_ and now you've baked this magic in they cannot possibly be explained at all in the book.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">> that</span><span style="font-size:12.8px"> might crash and produce a stack-trace</span></div><span style="font-size:12.8px"><div><span style="font-size:12.8px"><br></span></div>First bit they might pick up from context, they don't know what a stack trace is. Bonus round: when you explain things "from first principles", you can't duck the fact that it's actually a call graph when explaining a "stack" trace or call stack. Now you have to explain why/how it gets flattened from one representation into the other.<br><br><br></span><div>Oliver had it when he said,</div><div><br></div><div>><span style="font-size:12.8px">"What's a call stack?"</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">They don't know what a stack, a call, or the combination thereof is. We had planned to address these issues in the (much later) chapters that cover profiling and errors. Because that's when they're relevant. This hasn't been relevant the entire span of the book. It _never_ mattered that you didn't get a stack trace from bottoms. In practice, does it suck? Sure! But they're not practitioners yet! I am (I use Haskell for my 9-5 and have done for a year and a half) and it still hasn't mattered to me. The only time I've really wanted a stack trace is when this mechanism would not have been available to me to begin with.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Gamari / </span>amindfv</div><div><span class="im" style="font-size:12.8px">> I don't have a copy of GHC 8 atm to test this with: is an expression like this now illegal?<br>><br>> x :: Int<br>> x = undefined<br>><br></span><span style="font-size:12.8px">>This is still valid. The change in GHC 8.0 is merely that GHC will infer</span><br style="font-size:12.8px"><span style="font-size:12.8px">>a CallStack constraint instead of solving it in-place if asked to infer</span><br style="font-size:12.8px"><span style="font-size:12.8px">>a type for a let binding whose RHS demands a callstack.</span><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">We have readers use the REPL _a lot_. Not only to load code but also free-standing expressions in the REPL when experimenting and learning. Type assignment in the REPL is noisy and we have to write around some pretty gnarly width limitations (40-60 cols). </span><span style="font-size:12.8px">This breaks the examples where we're combining bottom and type inference to explore how terms and types interact.</span></div><div><br></div><div>I am less disturbed by `HasCallStack =>` than I was by the inferred type of ($).</div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I know designing around pedagogical limitations like this is tedious but imagine doing it for 900-1,200 pages (formatting varies) of tutorial and exercises, then getting unpleasant surprises right as the book is about to be done.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Sorry about the messy thread all.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">[1]: <a href="http://haskellformac.com/">http://haskellformac.com/</a></span></div><div><span style="font-size:12.8px"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 13, 2016 at 1:48 PM, Bryan Richter <span dir="ltr"><<a href="mailto:b@chreekat.net" target="_blank">b@chreekat.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sat, Feb 13, 2016 at 09:18:07AM -0800, Eric Seidel wrote:<br>
> Here's what the GHCi session should look like.<br>
><br>
> > $ ghci<br>
> > GHCi, version 8.0.0.20160204: <a href="http://www.haskell.org/ghc/" rel="noreferrer" target="_blank">http://www.haskell.org/ghc/</a>  :? for help<br>
> > Loaded GHCi configuration from /home/callen/.ghci<br>
> > Prelude> let myList = [1..5 :: Integer]<br>
> > Prelude> let myList' = myList ++ undefined<br>
> > Prelude> :t myList'<br>
> > myList' :: HasCallStack => [Integer]<br>
<br>
</span>What use case is satisfied by providing this information? How does it<br>
benefit the Haskell programmer? How do I use it?<br>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr">Chris Allen<br><div><span style="font-size:12.8000001907349px">Currently working on </span><a href="http://haskellbook.com" target="_blank">http://haskellbook.com</a></div></div></div></div></div></div>
</div>