Skip to content

The type defaulting in GHCi with Typeable

The type defaulting in GHCi works in less cases with GHC 7.8.1-rc2 than with older versions, though there is no change in the related part of the documentation (i.e., "2.4.7 Type defaulting in GHCi").

skata@kata58:~$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.0.20140228
skata@kata58:~$ ghci
GHCi, version 7.8.0.20140228: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :m +Data.Typeable
Prelude Data.Typeable> let {f :: Read a => (a->Bool) -> Char; f = undefined}
Prelude Data.Typeable> f (\x -> (x == 3))
*** Exception: Prelude.undefined                                                 <== This is the expected result.
Prelude Data.Typeable> let {f :: Typeable a => (a->Bool) -> Char; f = undefined}
Prelude Data.Typeable> f (\x -> (x == 3))                                  <== Type defaulting does not work in this case.

<interactive>:6:1:
    No instance for (Typeable a0) arising from a use of ‘f’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
      instance [overlap ok] Typeable ()
        -- Defined in ‘Data.Typeable.Internal’
      instance [overlap ok] Typeable Bool
        -- Defined in ‘Data.Typeable.Internal’
      instance [overlap ok] Typeable Char
        -- Defined in ‘Data.Typeable.Internal’
      ...plus 14 others
    In the expression: f (\ x -> (x == 3))
    In an equation for ‘it’: it = f (\ x -> (x == 3))

<interactive>:6:13:
    No instance for (Eq a0) arising from a use of ‘==’
    The type variable ‘a0’ is ambiguous
    Relevant bindings include x :: a0 (bound at <interactive>:6:5)
    Note: there are several potential instances:
      instance Eq a => Eq (GHC.Real.Ratio a) -- Defined in ‘GHC.Real’
      instance Eq Integer -- Defined in ‘integer-gmp:GHC.Integer.Type’
      instance Eq () -- Defined in ‘GHC.Classes’
      ...plus 33 others
    In the expression: (x == 3)
    In the first argument of ‘f’, namely ‘(\ x -> (x == 3))’
    In the expression: f (\ x -> (x == 3))

<interactive>:6:16:
    No instance for (Num a0) arising from the literal ‘3’
    The type variable ‘a0’ is ambiguous
    Relevant bindings include x :: a0 (bound at <interactive>:6:5)
    Note: there are several potential instances:
      instance Num Double -- Defined in ‘GHC.Float’
      instance Num Float -- Defined in ‘GHC.Float’
      instance Integral a => Num (GHC.Real.Ratio a)
        -- Defined in ‘GHC.Real’
      ...plus 7 others
    In the second argument of ‘(==)’, namely ‘3’
    In the expression: (x == 3)
    In the first argument of ‘f’, namely ‘(\ x -> (x == 3))’

On the other hand,

skata@kata58:~$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.1
skata@kata58:~$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :m +Data.Typeable
Prelude Data.Typeable> let {f :: Read a => (a->Bool) -> Char; f = undefined}
Prelude Data.Typeable> f (\x -> (x == 3))
*** Exception: Prelude.undefined
Prelude Data.Typeable> let {f :: Typeable a => (a->Bool) -> Char; f = undefined}
Prelude Data.Typeable> f (\x -> (x == 3))
*** Exception: Prelude.undefined

I think the old behavior is compliant with the documentation.

Trac metadata
Trac field Value
Version 7.8.1-rc2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information