[GHC] #13537: Adding underscore (m :: _) to pattern variable makes it fail
GHC
ghc-devs at haskell.org
Thu Apr 6 07:54:58 UTC 2017
#13537: Adding underscore (m :: _) to pattern variable makes it fail
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler (Type | Version: 8.0.1
checker) |
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Consider this:
{{{
data T where
MkT :: (forall a. a->a) -> T
f (MkT (g :: Int->Int)) = ..
}}}
Is this ok? Well yes. The argument of `MkT` has type `forall a. a->a`,
but it can be instantiated to the type `Int->Int`, so we can legitimately
end up with `g :: Int->Int`. In FC it'd look like
{{{
f x = case x of MkT (g2 :: forall a.a->a) ->
let g::Int->Int = g2 @ Int
in ...
}}}
Now you want to force the type of the pattern to be `_`. But since GHC
only supports predicative polymorphism, `_` must be a monotype. So GHC
instantiates `forall a. a->a` to `alpha -> alpha` (for some new
unification variable alpha), and proceeds.
And that is what you see in the first message "Found type wildcard...".
But alas of course, in your example we need `m` to be a polytype, and
making it a monotype leads to a subsequent rather obscure error message.
Does that help?
Is there some way we could improve the user manual?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13537#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list