[GHC] #14423: {-# complete #-} should be able to handle | like {-# minimal #-}

GHC ghc-devs at haskell.org
Sun Nov 5 01:32:36 UTC 2017


#14423: {-# complete #-} should be able to handle | like {-# minimal #-}
-------------------------------------+-------------------------------------
           Reporter:  ekmett         |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.1
  (Type checker)                     |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  8779
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 It'd be really convenient to be able to specify these like we can with
 `minimal` pragmas, mixing ands and ors. I wind up with a combinatorial
 explosion of such annotations for the cases where it works when I have
 large numbers of patterns.

 I have at least one use case where something that would be a trivial
 pattern to express with one (complicated) expression involving `|` becomes
 64 lines of complete pragmas, and every time I extend it this count
 doubles.

 Consider what happens if you add a mix of actual and smart views of a data
 type:

 {{{#!hs
 {-# language ViewPatterns, PatternSynonyms, GeneralizedNewtypeDeriving #-}

 newtype Delta = Delta Int deriving (Eq,Num)

 instance Monoid Delta where
   mempty = 0
   mappend = (+)

 data Exp = Var !Int | AP !Delta !Exp !Exp | LAM !Delta !Exp

 rel 0 xs = xs
 rel d (AP d' l r) = AP (d + d') l r
 rel d (LAM d' b) = LAM (d + d') b
 rel _ (Var n) = Var n

 pattern Ap a b <- AP d (rel d -> a) (rel d -> b) where
   Ap a b = AP 0 a b

 pattern Lam b <- LAM d (rel d -> b) where
   Lam b = LAM 0 b

 {-# complete Var, AP, Lam #-}
 {-# complete Var, Ap, LAM #-}
 {-# complete Var, AP, LAM #-}
 }}}

 Every data constructor I add with a smart view adds to the powerset of
 complete pragmas I should supply.

 On the other hand with `|` patterns:

 {{{#!hs
 {-# complete Var, (Ap | AP), (Lam | LAM) #-}
 }}}

 extends linearly.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14423>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list