[GHC] #14196: Replace ArrayArray# with either UnliftedArray# or Array#

GHC ghc-devs at haskell.org
Thu Sep 7 19:38:07 UTC 2017


#14196: Replace ArrayArray# with either UnliftedArray# or Array#
-------------------------------------+-------------------------------------
           Reporter:  andrewthad     |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.1
           Keywords:                 |  Operating System:  Unknown/Multiple
  LevityPolymorphism                 |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Just to be clear, there currently is nothing named `UnliftedArray#`. I
 would like to propose that such a thing possibly be added, with the long-
 term goal of deprecating and removing `ArrayArray#`. The interface for it
 would look like this:

 {{{#!hs
 data UnliftedArray# (a :: TYPE 'UnliftedRep)
 data MutableUnliftedArray# s (a :: TYPE 'UnliftedRep)

 indexUnliftedArray# :: forall (a :: TYPE 'UnliftedRep). UnliftedArray# a
 -> Int# -> a
 writeUnliftedArray# :: forall (a :: TYPE 'UnliftedRep).
 MutableUnliftedArray# s a -> Int# -> a -> State# s -> State# s
 readUnliftedArray# :: forall (a :: TYPE 'UnliftedRep).
 MutableUnliftedArray# s a -> Int# -> State# s -> (# State# s, a #)
 unsafeFreezeUnliftedArray# :: forall (a :: TYPE 'UnliftedRep).
 MutableUnliftedArray# s a -> State# s -> (#State# s, UnliftedArray# a#)
 newUnliftedArray# :: forall (a :: TYPE 'UnliftedRep). Int# -> a -> State#
 s -> (# State# s, MutableUnliftedArray# s a #)
 }}}

 You would also have a few other things like `sameMutableUnliftedArray#`,
 `sizeofMutableArray#`, `unsafeThawUnliftedArray#`, `copyUnliftedArray#`,
 etc. The main difficulty that I see in doing this is that I'm not sure if
 you can tell a primop that it takes a polymorphic argument whose kind is
 something other than `TYPE LiftedRep`. The bodies of all of the functions
 I listed above could simply be copied from the `ArrayArray#` functions.

 There are a few alternatives I've heard discussed. One is to make `Array#`
 accepted both boxed or unboxed types. There is a brief discussion of this
 in the UnliftedDataTypes proposal [#point0 (0)]. Indeed, it appears that
 some have managed to smuggle unlifted data into `Array#` already, with the
 caveats one would expect [#point1 (1)]. This interface would look like:

 {{{#!hs
 data Array# (a :: TYPE k)
 data MutableArray# s (a :: TYPE k)
 indexArray# :: Array# a -> Int -> a -- same as before
 indexUnliftedArray# :: forall (a :: TYPE UnliftedRep). Array# a -> Int ->
 a
 }}}

 So instead of having `Array#` and `UnliftedArray#` as separate data types,
 we could have `Array#` handle both cases, but we would need to make a
 duplicate of every function that operates on `Array#`. This follows all of
 the appropriate rules for when levity polymorphism is allowed, and it
 should be backwards-compatible with the previous non-levity-polymorphic
 definition of `Array#`. I'm not sure how many things in the GHC runtime
 assume that the values inside an array are lifted, so this might cause a
 bunch of problems. If it is possible, this approach would be kind of neat
 because then `SmallArray#` could be similarly adapted.

 Anyway, I just wanted to get this out there. I would be happy to try
 implementing the first proposal (involving `UnliftedArray#`) at some point
 in the next six months. Any feedback on the idea would be appreciated.
 Also, any comments on how appropriate this is for someone new to
 contributing to GHC would be appreciated as well. Thanks.

 * [=#point0 (0)]
 https://ghc.haskell.org/trac/ghc/wiki/UnliftedDataTypes#Parametricity
 * [=#point0 (1)]
 https://www.reddit.com/r/haskell/comments/6v9rmg/an_unified_array_interface/dlyph4i/

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


More information about the ghc-tickets mailing list