[GHC] #15674: GADT's displayed type is misleading
GHC
ghc-devs at haskell.org
Tue Sep 25 11:17:46 UTC 2018
#15674: GADT's displayed type is misleading
-------------------------------------+-------------------------------------
Reporter: AntC | Owner: (none)
Type: feature | Status: new
request |
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 8.6.1-beta1
Keywords: | Operating System: Windows
Architecture: x86_64 | Type of failure: Poor/confusing
(amd64) | error message
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
GHCi's `:t` alleges these three data constructors have the same type `::
Int -> T Int` (modulo name of the type constructor):
{{{#!hs
data DG a where MkDG :: Int -> DG Int
MkDG2 :: (a ~ Int) => a -> DG a
data family DF a
data instance DF Int where MkDF :: Int -> DF Int
}}}
I tried switching on verbosity flags, but to no avail: `-fprint-explicit-
foralls, -fprint-equality-relations`, and a few others.
The `DG` constructors are GADTs, the `DF` constructor is not. So it's not
hard to see different type-level behaviour:
{{{#!hs
f (MkDF x) = x -- accepted without a signature
-- f :: DF Int -> Int -- inferred signature, or you can spec
it
-- f :: DF a -> a -- rejected: signature is too general/
-- a is a rigid type variable
g (MkDG x) = x -- } without a signature, rejected
g (MkDG2 x) = x -- } "untouchable" type (Note)
-- g :: DG Int -> Int -- } g accepted with either sig
-- g :: DG a -> a -- } ?but MkDG doesn't return DG a,
allegedly
}}}
'''Note:''' at least the error message re `MkDG2` does show its type as
`:: (forall a). (a ~ Int) => DG a -> a`. But doggedly `MkDG :: Int -> DG
Int`.
"Untouchable" error messages are a fertile source of questions on
StackOverflow. The message does say `Possible fix: add a type signature
for 'g'`, but gives no clue what the signature might be.
If you've imported these data constructors from a library, such that you
can't (easily) see they're GADTs, couldn't `:t` give you better help to
show what's going on? Or should one of the verbosity flags already do
this?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15674>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list