[GHC] #8669: Closed TypeFamilies regression
GHC
ghc-devs at haskell.org
Tue Jan 14 14:25:47 UTC 2014
#8669: Closed TypeFamilies regression
------------------------------------------------+--------------------------
Reporter: merijn | Owner:
Type: bug | Status: new
Priority: high | Milestone:
Component: Compiler | Version: 7.7
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Incorrect result at runtime | Unknown/Multiple
Test Case: | Difficulty:
Blocking: | Unknown
| Blocked By:
| Related Tickets:
------------------------------------------------+--------------------------
Comment (by simonpj):
I know why this happens. If I add the kinds to the definition, I get
this:
{{{
type family Restrict k (a :: k) (as :: [k]) :: Constraint where
Restrict Symbol (a::Symbol) (a ': as) = (a ~ "Oops! Tried to apply a
restricted type!")
Restrict k (x::k) (a ': as) = Restrict x as
Restrict k (x::k) '[] = ()
}}}
The first equation only applies to types of kind `Symbol` because the RHS
has an equality that forces `a :: Symbol` since `"Oops" :: Symbol`.
The constraint `(Restricted (a:*) [(),Int])` can't match the first
equation (because the first equation matches only things of kind `Symbol`,
so it correctly chooses the second.
What to do? For your (2) how about this:
{{{
class Error (s::Symbol) -- No instances
}}}
Now `Error :: Symbol -> Constraint`, as you wanted, and you can write
{{{
type instance where
Restrict a (a ': as) = Error "Oops! Tried to apply a restricted type!"
Restrict x (a ': as) = Restrict x as
Restrict x '[] = ()
}}}
And away you go.
Simon
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8669#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list