[GHC] #8968: Pattern synonyms and GADTs
GHC
ghc-devs at haskell.org
Thu Apr 10 21:50:44 UTC 2014
#8968: Pattern synonyms and GADTs
----------------------------------------------+----------------------------
Reporter: kosmikus | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler (Type checker) | Version:
Resolution: | 7.8.1-rc2
Operating System: Unknown/Multiple | Keywords:
Type of failure: GHC rejects valid program | Architecture:
Test Case: | Unknown/Multiple
Blocking: | Difficulty: Unknown
| Blocked By:
| Related Tickets:
----------------------------------------------+----------------------------
Comment (by kosmikus):
> Alas, no. If the definition of T really did have that constructor P,
then GADT-style type refinement would take place when you match on P. So
for example, this would typecheck:
> {{{
> f :: T a b -> a -> Bool
> f P v = v && True
> }}}
> But obviously the expansion does not:
> {{{
> f :: T a b -> a -> Bool
> f (MkT x) v = v && True
> }}}
The expansion is `MkT True`, but it doesn't matter. Nice example. I'm
almost convinced, although I'll have to think about this a bit longer.
> Moreover, these are terribly simple examples. In general a pattern
synonym might mention dozens of constructor from dozens of types. Which
of those types would you like to pretend the pattern synonym constructor
is from?
I don't pretend that I have thought this through. I have only played with
pattern synonyms for a few days so far, and I don't completely understand
the possibilities of the interaction with ViewPatterns yet. However, in
the case of bidirectional pattern synonyms I'd expect a pattern synonym to
have a clear "target type".
> This is what I mean by modularity: no matter how complicated the right
hand side of the pattern synonym, I want the client (of the library
defining the pattern synonym) to be able to use it by knowing only its
type -- just like he can for a function exported by a library.
Yes, that's certainly a valid goal.
Ok, for now, let's try to summarize: Every (bidirectional) pattern
actually has two types, an "expression type" and a "pattern type".
If I understand your proposal correctly, you're saying that pattern type
signatures
should allow the user specify the pattern type, because the expression
type should in general be easy to infer.
So I should be able to say
{{{
pattern P :: T Bool b
pattern P = MkT True
}}}
or for my original example
{{{
pattern C :: Int -> Maybe a
pattern C x = Y (Just x)
}}}
So perhaps GHCi should print both types rather than only the expression
type on `:t`, something like:
{{{
GHCi> :t C
pattern C :: Int -> Maybe a
C :: Int -> Maybe Int
GHCi> :t P
pattern P :: T Bool b
P :: T Bool Bool
}}}
And perhaps for consistency even for normal data constructors?
{{{
GHCi> :t MkT
pattern MkT :: a -> T a b
MkT :: a -> T a Bool
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8968#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list