[GHC] #7828: RebindableSyntax and Arrow

GHC ghc-devs at haskell.org
Tue Jun 3 15:34:55 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:
----------------------------------------------+----------------------------

Comment (by ross):

 Replying to [comment:11 jstolarek]:
 > I have a few questions about implementation in `DsArrows` - I think
 these go to Ross.
 >
 >   1. What is the purpose of the stack created in the desugaring process?
 >   2. How do I read the notation describing each case of `dsCmd`? Eg. the
 `HsCmdApp` case has this comment:
 >
 > {{{
 > -- D; ys |-a cmd : (t,stk) --> t'
 > -- D, xs |-  exp :: t
 > -- ------------------------
 > -- D; xs |-a cmd exp : stk --> t'
 > --
 > --        ---> premap (\ ((xs),stk) -> ((ys),(e,stk))) cmd
 > }}}
 > What is `|-a`, `xs` and `ys`? What is the difference between `:` and
 `::`? Could you tell me how to read this particular comment? I should then
 be able to understand all the others. EDIT: Is there a semantic difference
 between `,` and `;` as in `D; ys` vs. `D, xs`?

 Yes, those differences in punctuation are significant.  A type judgement
 for an expression (ignoring constraints) looks like
 {{{
 D |- exp :: t
 }}}
 but one for a command looks like
 {{{
 D; xs |-a cmd : stk --> t
 }}}
 Here
 * a is the type of arrow for this command
 * D is the environment of the surrounding proc expression
 * xs are variables defined within the proc expression, which will be
 inputs to the arrow
 * stk is a list of anonymous inputs to the arrow
 * t is the output type of the arrow
 So the translation of this command should be an expression with type
 {{{
 D |- [[proc (xs) -> cmd]] : a ((xs),stk) t
 }}}
 In this particular rule, exp is typed using an ordinary expression
 judgement.  It can use both external valuables (D) and those local to the
 proc expression (xs), so these are combined in a single environment.
 (Commands, in contrast, need to keep these separate.)  The value of that
 expression is then pushed onto stk, which, together with xs, is input to
 cmd.  (The lambda rule for commands lets you take a value from the stack
 and put it in the local environment, giving it a name.)  The remaining
 wrinkle here is that cmd may not need all the variables in xs, but just
 the subset ys of xs, so the function inside the premap may also trim the
 environment from xs to ys.

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


More information about the ghc-tickets mailing list