Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't ghci provide the expected Ambiguous type variable error in this scenario?

I'm working through a Haskell book. It has the following example:

ghci> Right 3 >>= \x -> return (x + 100)  

It expects that this blows up with this error:

<interactive>:1:0:  
    Ambiguous type variable `a' in the constraints:  
      `Error a' arising from a use of `it' at <interactive>:1:0-33  
      `Show a' arising from a use of `print' at <interactive>:1:0-33  
    Probable fix: add a type signature that fixes these type variable(s)  

When I run it:

$ ghci

Prelude> Right 3 >>= \x -> return (x + 100) 

I get:

Right 103

ie I don't get the error expected.

Now maybe the compiler or the library has changed - but I'm not sure how to verify that.

My question is: Why doesn't ghci provide the expected Ambiguous type variable error in this scenario?

like image 805
hawkeye Avatar asked Jan 02 '18 04:01

hawkeye


1 Answers

This is due to -XExtendedDefaultRules being now enabled by default in GHCi. To turn it off (and get your expected error message):

ghci> :set -XNoExtendedDefaultRules
ghci> Right 3 >>= \x -> return (x + 100)
<interactive>:2:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance (Show b, Show a) => Show (Either a b)
          -- Defined in ‘Data.Either’
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        ...plus 23 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In a stmt of an interactive GHCi command: print it

This extension adds a bunch of extra ways to default otherwise ambiguous code. In your case, you have an expression of type Num b => Either a b. Regular Haskell defaulting rules tell us the b should default to Integer. The extended rules (see the link above) additionally default a to ().

like image 128
Alec Avatar answered Nov 15 '22 10:11

Alec