[GHC] #9220: type roles for unboxed arrays

GHC ghc-devs at haskell.org
Sat Nov 15 02:13:45 UTC 2014


#9220: type roles for unboxed arrays
-------------------------------------+-------------------------------------
              Reporter:  rwbarton    |            Owner:  goldfire
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:  7.10.1
             Component:  Core        |          Version:  7.8.1
  Libraries                          |         Keywords:
            Resolution:              |     Architecture:  Unknown/Multiple
      Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple                   |       Blocked By:
       Type of failure:              |  Related Tickets:
  None/Unknown                       |
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by ekmett):

 Ok, lets go through Array with a fine toothed comb:

 {{{
 type role Array nominal representational
 type role IOArray nominal representational
 }}}

 That lets users case the element type in the array. This is safe because
 e.g. `instance IArray Array e` is fully polymorphic in `e` with no
 constraints. The index has to be nominal as it is tied to the semantics of
 the internal bounds, the underlying array size, etc. Users can coerce
 boxed arrays to change the element types.

 {{{
 type role UArray nominal nominal
 type role IOUArray nominal nominal
 type role StorableArray nominal nominal
 }}}

 The index is nominal for the same reason as above, the element type is
 nominal because we'd otherwise silently be re-interpreting the bit
 representation of the underlying storables in the latter case, and the
 interpretation of the array size, etc. changes based on the same sort of
 information in `UArray` and `IOUArray`.

 {{{
 type role STArray nominal nominal representational
 type role STUArray nominal nominal nominal
 }}}

 The region parameter is nominal lest users easily subvert `ST` safety,
 otherwise same as `Array` and `UArray` respectively.

 It turns out there isn't a lot of representational material here, just the
 element type in `Array`, `STArray` and `IOArray`.

 Every other role in the entire `array` package is necessarily `nominal`.

 Does that give enough to proceed?

 That should be every type used by the package, though, I think the bulk
 comes from `GHC.Arr`.

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


More information about the ghc-tickets mailing list