[GHC] #12551: Make type indices take local constraints into account in type instance declaration
GHC
ghc-devs at haskell.org
Tue Aug 30 02:49:49 UTC 2016
#12551: Make type indices take local constraints into account in type instance
declaration
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Resolution: | Keywords: TypeFamilies
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
@@ -7,2 +7,2 @@
- Full :: a -> Sig a
- (:->) :: a -> b -> Sig a
+ Full :: a -> Sig a
+ (:->) :: a -> Sig a -> Sig a
New description:
Given
{{{#!hs
infixl 1 :$
infixr :->
data Sig x where
Full :: a -> Sig a
(:->) :: a -> Sig a -> Sig a
data AST dom a where
Sym :: dom a -> AST dom a
(:$) :: AST dom (a:->b) -> AST dom (Full a) -> AST dom b
class Syntactic a dom | a -> dom where
type Rep a
desugar :: a -> AST dom (Full (Rep a))
sugar :: AST dom (Full (Rep a)) -> a
}}}
I want to be able to define the trivial instance for `Syntactic (AST dom
(Full a))`:
{{{#!hs
instance Syntactic (AST dom (Full a)) dom where
type Rep (AST dom (Full a)) = a
desugar, sugar :: AST dom (Full a) -> AST dom (Full a)
desugar = id
sugar = id
}}}
This should be the only `Syntactic` instance for `AST _ _` so I would like
to apply the [http://chrisdone.com/posts/haskell-constraint-trick
‘constraint’ trick]
([https://gist.github.com/Icelandjack/5afdaa32f41adf3204ef9025d9da2a70
#blog-reddit-constraint-trick-for-instances link]) but I cannot use the
`Rep` instance as before:
{{{#!hs
-- • Type indexes must match class instance head
-- Found ‘AST dom ('Full a)’ but expected ‘AST dom full_a’
-- • In the type instance declaration for ‘Rep’
-- In the instance declaration for ‘Syntactic (AST dom full_a) dom’
instance full_a ~ Full a => Syntactic (AST dom full_a) dom where
type Rep (AST dom (Full a)) = a
}}}
Maybe this could be accepted, given that `full_a ~ Full a`, therefore the
instance head is equal to `AST dom (Full a)`?
My current workaround is using a type family
{{{#!hs
type family
Edrú a where
Edrú (Full a) = a
instance full_a ~ Full a => Syntactic (AST dom full_a) dom where
type Rep (AST dom full_a) = Edrú full_a
desugar, sugar :: AST dom (Full a) -> AST dom (Full a)
desugar = id
sugar = id
}}}
--
Comment (by Iceland_jack):
Replying to [ticket:12551 Iceland_jack]:
> Given
>
> {{{#!hs
> infixl 1 :$
> infixr :->
> data Sig x where
> Full :: a -> Sig a
> (:->) :: a -> b -> Sig a
>
> data AST dom a where
> Sym :: dom a -> AST dom a
> (:$) :: AST dom (a:->b) -> AST dom (Full a) -> AST dom b
>
> class Syntactic a dom | a -> dom where
> type Rep a
> desugar :: a -> AST dom (Full (Rep a))
> sugar :: AST dom (Full (Rep a)) -> a
> }}}
>
> I want to be able to define the trivial instance for `Syntactic (AST dom
(Full a))`:
>
> {{{#!hs
> instance Syntactic (AST dom (Full a)) dom where
> type Rep (AST dom (Full a)) = a
> desugar, sugar :: AST dom (Full a) -> AST dom (Full a)
> desugar = id
> sugar = id
> }}}
>
> This should be the only `Syntactic` instance for `AST _ _` so I would
like to apply the [http://chrisdone.com/posts/haskell-constraint-trick
‘constraint’ trick]
([https://gist.github.com/Icelandjack/5afdaa32f41adf3204ef9025d9da2a70
#blog-reddit-constraint-trick-for-instances link]) but I cannot use the
`Rep` instance as before:
>
> {{{#!hs
> -- • Type indexes must match class instance head
> -- Found ‘AST dom ('Full a)’ but expected ‘AST dom full_a’
> -- • In the type instance declaration for ‘Rep’
> -- In the instance declaration for ‘Syntactic (AST dom full_a)
dom’
>
> instance full_a ~ Full a => Syntactic (AST dom full_a) dom where
> type Rep (AST dom (Full a)) = a
> }}}
>
> Maybe this could be accepted, given that `full_a ~ Full a`, therefore
the instance head is equal to `AST dom (Full a)`?
>
> My current workaround is using a type family
>
> {{{#!hs
> type family
> Edrú a where
> Edrú (Full a) = a
>
> instance full_a ~ Full a => Syntactic (AST dom full_a) dom where
> type Rep (AST dom full_a) = Edrú full_a
> desugar, sugar :: AST dom (Full a) -> AST dom (Full a)
> desugar = id
> sugar = id
> }}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12551#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list