haskell / primitive

This package provides various primitive memory-related operations.
Other
114 stars 58 forks source link

Add support for boxed but unlifted element types to Primitive.Array #419

Open dcoutts opened 4 hours ago

dcoutts commented 4 hours ago

Right now, P.Array supports only lifted types (types of kind *)

ghci> :kind Data.Primitive.Array.Array GHC.Exts.ByteArray#

<interactive>:1:28: error: [GHC-83865]
    • Expected a lifted type, but ‘ByteArray#’ is a boxed unlifted type
    • In the first argument of ‘Data.Primitive.Array.Array’, namely
        ‘ByteArray#’
      In the type ‘Data.Primitive.Array.Array ByteArray#’

But, in recent GHC versions, the underlying Array# type supports any boxed (lifted or unlifted) type:

ghci> :kind GHC.Exts.Array# GHC.Exts.ByteArray#
GHC.Exts.Array# GHC.Exts.ByteArray# :: ghc-prim:GHC.Types.UnliftedType

The primitive array type should be similarly extended to support this.

It would be very useful, to reduce allocations and indirections (and easily enforce strictness) when using types like ByteArray#. In particular it would support higher level libraries like vector to provide useful Unbox instances for the wrapper types like ByteArray.

konsumlamm commented 3 hours ago

See https://github.com/haskell/primitive/issues/356.