type error formatting
Evan Laforge
qdunkan at gmail.com
Wed Nov 4 00:37:48 UTC 2015
A diff is up at https://phabricator.haskell.org/D1427
On Sat, Oct 24, 2015 at 1:14 PM, Evan Laforge <qdunkan at 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 <simonpj at microsoft.com>
> wrote:
>>
>> I’m all for it. Can advise. (Make a ticket.)
>>
>>
>>
>> Thanks!
>>
>>
>>
>> Simon
>>
>>
>>
>> From: Glasgow-haskell-users
>> [mailto:glasgow-haskell-users-bounces at 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.
>
>
More information about the Glasgow-haskell-users
mailing list