[GHC] #13778: explicitly bidirectional patterns should not report Recursive definition" when used in view pattern expression position

GHC ghc-devs at haskell.org
Mon Jun 5 10:51:28 UTC 2017


#13778: explicitly bidirectional patterns should not report Recursive definition"
when used in view pattern expression position
-------------------------------------+-------------------------------------
        Reporter:  heisenbug         |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.3
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms
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 simonpj):

 Harump.  I think you want

 1. To infer the type of `One` from its "builder"
 {{{
   One = 1
 }}}

 2. To use that type when inferring the type of the pattern

 But actually GHC does it the other way round

 1.  Infer the type of the pattern
 2.  Use that in checking the type of the "builder"

 There's a good reason for this.  Here's a Note from `RnBinds`:
 {{{
 Note [Pattern synonym builders don't yield dependencies]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 When renaming a pattern synonym that has an explicit builder,
 references in the builder definition should not be used when
 calculating dependencies. For example, consider the following pattern
 synonym definition:

 pattern P x <- C1 x where
   P x = f (C1 x)

 f (P x) = C2 x

 In this case, 'P' needs to be typechecked in two passes:

 1. Typecheck the pattern definition of 'P', which fully determines the
    type of 'P'. This step doesn't require knowing anything about 'f',
    since the builder definition is not looked at.

 2. Typecheck the builder definition, which needs the typechecked
    definition of 'f' to be in scope; done by calls oo tcPatSynBuilderBind
    in TcBinds.tcValBinds.

 This behaviour is implemented in 'tcValBinds', but it crucially
 depends on 'P' not being put in a recursive group with 'f' (which
 would make it look like a recursive pattern synonym a la 'pattern P =
 P' which is unsound and rejected).
 }}}
 So I don't see an easy way to give you want you want.

 The only think I can think of is to allow some kind of monomorphic
 recursion.   But it's easy to program around, so I'm disinclined to
 fiddle.

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


More information about the ghc-tickets mailing list