Exhaustiveness checking for pattern synonyms
Simon Peyton Jones
simonpj at microsoft.com
Fri Jan 13 15:49:47 UTC 2017
Thanks.
| > * What if there are multiple COMPLETE pragmas e.g.
| > {-# COMPLETE A, B, C #-}
| > {-# COMPLETE A, X, Y, Z #-}
| > Is that ok? I guess it should be!
| >
| > Will the pattern-match exhaustiveness check then succeed
| > if a function uses either set?
| >
| > What happens if you use a mixture of constructors in a match
| > (e.g. A, X, C, Z)? Presumably all bets are off?
|
| Yes this is fine. In the case you ask about then as neither COMPLETE pragma
| will match then the "best" one as described in the error messages section
| will be chosen.
The wiki spec doesn't say this (presumably under "semantics"). Could it?
| > * Note that COMPLETE pragmas could be a new source of orphan modules
| > module M where
| > import N( pattern P, pattern Q )
| > {-# COMPLETE P, Q #-}
| > where neither P nor Q is defined in M. Then every module that is
| > transitively "above" M would need to read M.hi just in case its
| > COMPLETE pragmas was relevant.
Can you say this in the spec?
| >
| > * Point out in the spec that COMPLETE pragmas are entirely unchecked.
| > It's up to the programmer to get it right.
Can you say this in the spec? Ah -- it's in "Discussion"... put it under "Semantics".
| >
| > * Typing. What does it mean for the types to "agree" with each other.
| > E.g A :: a -> [(a, Int)]
| > B :: b -> [(Int, b)]
| > Is this ok? Please say explicitly with examples.
|
| This would be ok as the type constructor of both result types is [].
Can you say this in the spec?
|
| > * I didn't really didn't understand the "Error messages" section.
| >
| >
|
| I can't really help unless I know what you don't understand.
"The pattern match checker checks each set of patterns individually"
Given a program, what are the "sets of patterns", precisely?
| The idea is simply that all the different sets of patterns are tried and
| that the results are prioritised by
|
| 1. Fewest uncovered clauses
| 2. Fewest redundant clauses
| 3. Fewest inaccessible clauses
| 4. Whether the match comes from a COMPLETE pragma or the build in set of
| data constructors for a type constructor.
Some examples would be a big help.
Simon
|
|
|
| > Simon
| >
| > | -----Original Message-----
| > | From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
| > | Matthew Pickering
| > | Sent: 22 November 2016 10:43
| > | To: GHC developers <ghc-devs at haskell.org>
| > | Subject: Exhaustiveness checking for pattern synonyms
| > |
| > | Hello devs,
| > |
| > | I have implemented exhaustiveness checking for pattern synonyms.
| > | The idea is very simple, you specify a set of pattern synonyms (or
| > | data
| > | constructors) which are regarded as a complete match.
| > | The pattern match checker then uses this information in order to
| > | check whether a function covers all possibilities.
| > |
| > | Specification:
| > |
| > | https://ghc.haskell.org/trac/ghc/wiki/PatternSynonyms/CompleteSigs
| > |
| > | https://phabricator.haskell.org/D2669
| > | https://phabricator.haskell.org/D2725
| > |
| > | https://ghc.haskell.org/trac/ghc/ticket/8779
| > |
| > | Matt
| > | _______________________________________________
| > | ghc-devs mailing list
| > | ghc-devs at haskell.org
| > |
| > | https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail
| > | .haskell
| > | .org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-
| > |
| > | devs&data=02%7C01%7Csimonpj%40microsoft.com%7C155eb2786cb040d8052908
| > | d412c453
| > | b5%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636154081815249356&s
| > | data=MkQ
| > | FpwJWaTU%2BdEQSYEBjXLt80BrXLkBp9V8twdKB6BI%3D&reserved=0
|
| I updated the wiki page quite a bit. Thanks Simon for the comments.
|
| Matt
More information about the ghc-devs
mailing list