[GHC] #14218: GHC.Stack.HasCallStack not compatible with constraint synonyms
GHC
ghc-devs at haskell.org
Thu Sep 14 13:40:41 UTC 2017
#14218: GHC.Stack.HasCallStack not compatible with constraint synonyms
-------------------------------------+-------------------------------------
Reporter: ntc2 | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.2.1
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):
It's nothing specific about call-stacks. It's in implicit parameters:
{{{
type C2 = (?x::Int, ?y::Int)
h1 :: C2 => Int -> IO ()
h1 v = print (?x+v)
-- h2 :: (?x::Int, ?y::Int) => Int -> IO ()
h2 :: C2 => Int -> IO ()
h2 v = let ?x = 0 in h1 v
main = let { ?x = 3; ?y = 4 } in h2 4
}}}
This prints 7; but if you swap to the other (equivalent!) type sig for
`h2` it prints 4 (as it should).
Reason: in `h2`, when calling `h1` we should really rebuild a pair-
constraint to pass on to `h1` so that we "see" the binding (which behaves
like a local instance declaration) for `?x`. But we don't: we just have a
wanted constraint `[W] C2` and a given one with the same type, and solve
one from the other.
We don't allow implicit parameters as superclasses for exactly this
reason. It matters precisely where an implicit parameter constraint is
solved, so you can't meaningfully abstract over them.
`HasCallStack` is really just an implicit parameter, so it fails in the
same way.
Possible solutions:
1. Don't allow implicit parameters in type synonyms, or
2. Expand type synonyms in constraints more aggressively, so they really
behave ''exactly'' like the expanded version.
I vote for (2). Indeed I was surprised that doesn't happen already.
But I think we should prohibit
{{{
type instance F [a] = (?x::a, Show a)
}}}
with an implicit parameter on the right. Now aggressive expansion won't
always work. This should be just as illegal as implicit parameters in
superclasses.
In effect, implicit parameters aren't really a first-class constraint
form: you can't abstract over them.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14218#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list