[GHC] #10116: Closed type families: Warn if it doesn't handle all cases
GHC
ghc-devs at haskell.org
Tue Dec 22 09:53:14 UTC 2015
#10116: Closed type families: Warn if it doesn't handle all cases
-------------------------------------+-------------------------------------
Reporter: andrewthad | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.4
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 gkaracha):
Replying to [comment:3 goldfire]:
> I conjecture that getting this completely right for closed type families
is a research project of its own, because closed type families allow for
repeated variables.
Hmmmm, I agree that it is a research project on its own but I have been
working
on it the past months. If we use the technique we use in the [PAPER] to
make
the clauses semi-linear (linear but interleaved with guards - every non-
linear
pattern matching can be transformed this way), the match becomes:
{{{#!hs
type family F (a :: Bool) (b :: Maybe Bool) :: Nat where
F True (Just False) = 0
F False (Just True) = 1
F x (Just z (z ~ x)) = 2
F y Nothing = 3
}}}
Hence, by applying the algorithm as is we get (I omit constraints Delta
where
we don't have any or where they are just variable bindings that do not
refer
to the same variable):
{{{
U1 = { False x1, True Nothing, True (Just True) }
U2 = { False Nothing, False (Just False)
, True Nothing
, True (Just True) }
U3 = { False Nothing
, False (Just False) |> {x ~ False, z ~ False, not (z ~ x)} --
inconsistent
, True Nothing
, True (Just True) |> {x ~ True, z ~ True, not (z ~ x)} } --
inconsistent
-- and cleaned up
U3 = { False Nothing, True Nothing }
U4 = {}
}}}
So, my biggest concern is not the lack of linearity. I also seem to have
found
a way to treat explicit type applications in patterns. The issues that
still
bother me a bit are the following:
1. Kind polymorphism is non-parametric and we can also have non-linear
kind patterns
2. Haskell is not lazy at the type level so I expect us to miss
completeness which we can have at the term level due to laziness.
3. I have no clue yet how to take injectivity annotations into account.
I have plenty of ideas for 1 and 2 (at least on paper they seem to work)
but I
expect the 3rd to be more challenging to address. I am not setting myself
as
the owner yet, unless I find a way to incorporate the above but I hope to
do so
in 2016. :)
George
P.S. And since closed type families are usually MUCH smaller than term
level
functions and also they do not allow arbitrary guards (yet at least) but
only
the ones the check will generate, I expect such a check to be performant,
in
contrast to term-level pattern match checking.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10116#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list