Skip to content

The GHCi debugger loses type constraints

Summary

The GHCi debugger loses the type constraints of the breakpoint variables..

Steps to reproduce

Foo.hs is a simplified version of testcase break012:

foo :: (Num a1, Num a2) => a2 -> (a2, a1 -> a1 -> a1)
foo i = let incr = i + 1
            add = (+)
        in (incr,add)

Observe the following GHCi session:

$ ghci Foo.hs
GHCi, version 9.0.1: https://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( Foo.hs, interpreted )
Ok, one module loaded.
ghci> :st foo 5 `seq` ()
Stopped in Main.foo, Foo.hs:4:12-21
_result :: (a2, a1 -> a1 -> a1) = _
add :: a1 -> a1 -> a1 = _
incr :: a2 = _
[Foo.hs:4:12-21] ghci> add 40 2

<interactive>:2:5: error:
    • No instance for (Num a1) arising from the literal ‘40’
      Cannot resolve unknown runtime type ‘a1’
      Use :print or :force to determine these types
      Relevant bindings include it :: a1 (bound at <interactive>:2:1)
      These potential instances exist:
        instance Num Integer -- Defined in ‘GHC.Num’
        instance Num Double -- Defined in ‘GHC.Float’
        instance Num Float -- Defined in ‘GHC.Float’
        ...plus two others
        ...plus one instance involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the first argument of ‘add’, namely ‘40’
      In the expression: add 40 2
      In an equation for ‘it’: it = add 40 2
[Foo.hs:4:12-21] ghci>

The types of all breakpoint variables lack Num contraints!

Expected behavior

The types of the 2 breakpoint variables (_result, add) should have a Num constraint for a1. The type of incr should be Integer. The correct types are:

_result :: Num a1 => Integer -> (Integer, a1 -> a1 -> a1) = _  
add :: Num a1 => a1 -> a1 -> a1 = _
incr :: Integer = _

The result of add 40 2 should be 42 and not an error message.

Environment

  • GHC versions used: 7.10.3, 8.10.2, 9.0.1, HEAD (in 7.10.3 only the _result breakpoint variable is shown)
  • Operating System: Linux Debian 10
  • System Architecture: x86_64
Edited by Roland Senn
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information