At the very least, "bound at" should help IDEs (Emacs in particular) show 
exactly the right places.

> On 24 Oct 2015, at 22:14, Evan Laforge <qdun...@gmail.com> wrote:
> 
> Ok, ticket created.  I'll go see how much I can figure out on my own.
> 
> https://ghc.haskell.org/trac/ghc/ticket/11014
> 
> WRT the "bound at" bits in "relevant bindings", I have no strong opinion.  
> What about omitting them if they are in the same file as the main error?  Or 
> maybe they always are?  I'm not totally clear how it chooses which bindings 
> are relevant.
> 
> On Sat, Oct 24, 2015 at 12:50 PM, Simon Peyton Jones <simo...@microsoft.com> 
> wrote:
> I’m all for it.   Can advise.  (Make a ticket.)
> 
>  
> 
> Thanks!
> 
>  
> 
> Simon
> 
>  
> 
> From: Glasgow-haskell-users 
> [mailto:glasgow-haskell-users-boun...@haskell.org] On Behalf Of Evan Laforge
> Sent: 24 October 2015 03:48
> To: GHC users
> Subject: type error formatting
> 
>  
> 
> Here's a typical simple type error from GHC:
> 
>  
> 
> Derive/Call/India/Pakhawaj.hs:142:62:
>     Couldn't match type ‘Text’ with ‘(a1, Syllable)’
>     Expected type: [([(a1, Syllable)], [Sequence Bol])]
>       Actual type: [([Syllable], [Sequence Bol])]
>     Relevant bindings include
>       syllables :: [(a1, Syllable)]
>         (bound at Derive/Call/India/Pakhawaj.hs:141:16)
>       best_match :: [(a1, Syllable)]
>                     -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))
>         (bound at Derive/Call/India/Pakhawaj.hs:141:5)
>     In the second argument of ‘mapMaybe’, namely ‘all_bols’
>     In the second argument of ‘($)’, namely
>       ‘mapMaybe (match_bols syllables) all_bols’
> 
> I've been having more trouble than usual reading GHC's errors, and I finally 
> spent some time to think about it.  The problem is that this new "relevant 
> bindings include" section gets in between the expected and actual types (I 
> still don't like that wording but I've gotten used to it), which is the most 
> critical part, and the location context, which is second most critical.  
> Notice the same effect in the previous sentence :)  After I see a type error 
> the next thing I want to see is the where it happened, so I have to skip over 
> the bindings, which can be long and complicated.  Then I usually know what to 
> do, and only look into the bindings if something more complicated is going 
> on, like wonky inference.  So how about reordering the message:
> 
> Derive/Call/India/Pakhawaj.hs:142:62:
>     Couldn't match type ‘Text’ with ‘(a1, Syllable)’
>     Expected type: [([(a1, Syllable)], [Sequence Bol])]
>       Actual type: [([Syllable], [Sequence Bol])]
>     In the second argument of ‘mapMaybe’, namely ‘all_bols’
>     In the second argument of ‘($)’, namely
>       ‘mapMaybe (match_bols syllables) all_bols’
>     Relevant bindings include
>       syllables :: [(a1, Syllable)]
>         (bound at Derive/Call/India/Pakhawaj.hs:141:16)
>       best_match :: [(a1, Syllable)]
>                     -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))
>         (bound at Derive/Call/India/Pakhawaj.hs:141:5)
> 
> After this, why not go one step further and set off the various sections 
> visibly to make it easier to scan.  The context section can also be really 
> long if it gets an entire do block or record:
> 
> Derive/Call/India/Pakhawaj.hs:142:62:
>   * Couldn't match type ‘Text’ with ‘(a1, Syllable)’
>     Expected type: [([(a1, Syllable)], [Sequence Bol])]
>       Actual type: [([Syllable], [Sequence Bol])]
>   * In the second argument of ‘mapMaybe’, namely ‘all_bols’
>     In the second argument of ‘($)’, namely
>       ‘mapMaybe (match_bols syllables) all_bols’
>   * Relevant bindings include
>       syllables :: [(a1, Syllable)]
>         (bound at Derive/Call/India/Pakhawaj.hs:141:16)
>       best_match :: [(a1, Syllable)]
>                     -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))
>         (bound at Derive/Call/India/Pakhawaj.hs:141:5)
> 
>  
> 
> Or alternately, taking up a bit more vertical space:
> 
>  
> 
> Derive/Call/India/Pakhawaj.hs:142:62:
>     Couldn't match type ‘Text’ with ‘(a1, Syllable)’
>     Expected type: [([(a1, Syllable)], [Sequence Bol])]
>       Actual type: [([Syllable], [Sequence Bol])]
> 
>         -----------------------------
>     In the second argument of ‘mapMaybe’, namely ‘all_bols’
>     In the second argument of ‘($)’, namely
>       ‘mapMaybe (match_bols syllables) all_bols’
> 
>         -----------------------------
>     Relevant bindings include
> 
>       syllables :: [(a1, Syllable)]
>         (bound at Derive/Call/India/Pakhawaj.hs:141:16)
>       best_match :: [(a1, Syllable)]
>                     -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))
>         (bound at Derive/Call/India/Pakhawaj.hs:141:5)
> 
>  
> 
> Thoughts?  It seems simple enough that I could do myself, but of course not 
> without buy-in.
> 
> 
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users

Reply via email to