Static Pointers with type classes generate misleading errors
Summary
Using static with members of type classes generates unexpected and misleading type errors. The type errors produced by GHC complain about unsatisfiable type class constraints when the problem is (implicitly) that there is an unclosed argument.
Steps to reproduce
{-# LANGUAGE StaticPointers #-}
{-# LANGUAGE GADTs #-}
import Type.Reflection (TypeRep, Typeable, typeRep)
import GHC.StaticPtr
data Dynamic where
Typed :: a -> StaticPtr (TypeRep a) -> Dynamic
toDyn :: (Typeable a) => a -> Dynamic
toDyn x = Typed x (static typeRep)
main :: IO ()
main = undefined
Compiling this produces the following error:
• No instance for (Typeable a) arising from a use of ‘typeRep’
• In the body of a static form: typeRep
In the second argument of ‘Typed’, namely ‘(static typeRep)’
In the expression: Typed x (static typeRep)
|
11 | toDyn x = Typed x (static typeRep)
| ^^^^^^^
The type error is unexpected, given that the assumption that static can be thought of as static :: a -> StaticPtr a. We can then introduce a function
static2 :: a -> StaticPtr a
static2 = undefined
and replacing static with static2 allows the code to typecheck.
Expected behavior
When using static with the member of a type class, this should be treated the same, or similar to using static with an unclosed argument.
Environment
- GHC version used: 8.6.5
Optional:
- Operating System: Windows 10
- System Architecture: 64 bit