[GHC] #7828: RebindableSyntax and Arrow

GHC ghc-devs at haskell.org
Wed Jun 18 09:03:15 UTC 2014


#7828: RebindableSyntax and Arrow
----------------------------------------------+----------------------------
        Reporter:  AlessandroVermeulen        |            Owner:
            Type:  bug                        |  jstolarek
        Priority:  normal                     |           Status:  new
       Component:  Compiler (Type checker)    |        Milestone:  7.10.1
      Resolution:                             |          Version:  7.6.2
Operating System:  Unknown/Multiple           |         Keywords:
 Type of failure:  GHC rejects valid program  |     Architecture:
       Test Case:                             |  Unknown/Multiple
        Blocking:                             |       Difficulty:  Unknown
                                              |       Blocked By:
                                              |  Related Tickets:  #1537,
                                              |  #3613
----------------------------------------------+----------------------------

Comment (by ross):

 Replying to [comment:33 jstolarek]:
 > > A command can have the form \ p -> cmd, and that's what we have here
 >
 > Ah, so you used `\` to denote the command abstraction (`proc`), not a
 lambda abstraction? That got me confused.

 Not quite.  There are three different grammar items here:
 {{{
 exp  ::=  \ pat -> exp
 exp  ::=  proc pat -> cmd
 cmd  ::=  \ pat -> cmd
 }}}
 In the last one you're already in the command world, and you want to take
 a value off the stack and give names to its components for use in the
 subcommand.

 > > > So if I want to typecheck the arrow desugaring I need to typecheck
 *exactly* the form to which it will later be desugared, including all the
 explicit stacks, etc?
 > >
 > > Yes you do, and that will be harder in the arrow case, because the
 local environment is an explicit input to the resulting arrow, and the
 desugarer feels free to trim unused variables from that environment, which
 will change its type.
 >
 > And that means that at the typechecking stage I have to exactly follow
 the whole desugaring algorithm, right? Sounds non-trivial.

 If you want to rebind at the level of `arr`, etc, partly (as Simon says)
 and yes it is.

 Replying to [comment:34 simonpj]:
 > I'm not following all of this, but my instinct is this.  The semantics
 of the program should not depend on the details of desugaring.  So the
 various calls to `arr`, `(>>>)` in the desugarer should not dispatch to
 different instances depending on the size of the tuple.  So the type
 checker should be able to construct functions `arr-at-T`, `(>>>)-at-T`
 (for the ambient arrow T) ''that are polymorphic in the environment
 argument''.

 Yes indeed.  And because of the multiple occurrences of `arr` and `>>>` in
 the translations, this will severely constrain the types of any
 replacements, to the point that I wonder if the rebinding will solve the
 original users' issues.

 > I am having trouble getting to grips with this because I know of no
 document that gives:
 >  * The syntax of the arrow sub-language (including comprehensions)
 >  * The typing rules for that language
 >  * The desugaring for that language
 >
 > Having such a document would be extremely helpful in making sure we were
 all on staring from the same baseline.

 Well there is http://www.haskell.org/ghc/docs/papers/arrow-rules.pdf, but
 it needs updating to the new stack representation.  I'll do that.

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


More information about the ghc-tickets mailing list