[GHC] #14770: Allow static pointer expressions to have static pointer free variables

GHC ghc-devs at haskell.org
Tue Feb 6 23:14:27 UTC 2018


#14770: Allow static pointer expressions to have static pointer free variables
-------------------------------------+-------------------------------------
           Reporter:  TheKing01      |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.2
           Keywords:                 |  Operating System:  Unknown/Multiple
  StaticPointers                     |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Static pointer expressions can not have free variables. For example:

 {{{#!hs
 addPointers :: StaticPtr Int -> StaticPtr Int -> StaticPtr Int
 addPointers x y = static (deRefStaticPtr x + deRefStaticPtr y)
 }}}

 would be invalid, since `x` and `y` are free variables. My proposal would
 be to make this code sample valid. In particular, my proposal is to allow
 free variables in `static` expressions if the free variables of the type
 `StaticPtr a` for some type `a`.

 Let's say that `m` `n` are Static pointers to integers. The serialized
 form would of `addPointers m n` would be:

 A pointer to the code `deRefStaticPtr x + deRefStaticPtr y`

 The serialized form of `m`, associated with `x`.

 The serialized form of `n`, associated with `y`.

 When this is sent over the wire and dereferenced, the other machine would

 Find `m` and `n`'s pointers

 Find the code `deRefStaticPtr x + deRefStaticPtr y`

 Evaluate `deRefStaticPtr x + deRefStaticPtr y`, substituting `m`'s value
 for `x`, and `n`'s value for y.

 The reason this feature would be useful is would let the user modify and
 combine static pointers.

 You might ask "why not let the user create a GADT to do that (like in
 https://hackage.haskell.org/package/distributed-static-0.3.8/docs/Control-
 Distributed-Static.html#t:Static)?" The reason is that then it won't fuse
 (with recreating every fusion rule for that GADT). For example, if `m` is
 `static 7` and `n` is `static 3`, then `addPointers m n` can fuse to
 `static 11`.

 This is more important then it seems. For example, say you have
 `composePointers :: StaticPtr (a -> b) -> StaticPtr (b -> c) -> StaticPtr
 (a -> c)`, and you compose a bunch of pointers. With the GADTS, every
 `composePointers` would be its own node, but with GHC support, it would
 probably fuse.

 In general, dealing with a GADT requires a lot of "glue code" that can be
 eliminated with GHC support. I'm not sure if this proposal makes a
 performance difference (it probably makes it more efficient), but it would
 make code more elegant, cutting out all the glue code.

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


More information about the ghc-tickets mailing list