<div dir="auto">It's currently hard to describe that a type should be usable with UArray or IOUArray, and almost impossible to describe without QualifiedConstraints that it should be usable with STUArray. And it's actually impossible to use GeneralizedNewtypeDeriving to derive new instances of IArray or MArray. It also means that it's difficult to keep the three sets of instances in sync.<div dir="auto"><br></div><div dir="auto">Therefore, there should be (taking inspiration from primitive) a class that describes types which can be used in unboxed arrays. It'd be something along the lines of:</div><div dir="auto"><br></div><div dir="auto">class Unboxed e where</div><div dir="auto">  unsafeNewUArray :: Int# -> e -> State# s -> (# State# s, MutableByteArray# s #)</div><div dir="auto">  unsafeNewUArray_ :: Const (Int# -> State# s -> (# State# s, MutableByteArray# s #)) e</div><div dir="auto">  unsafeReadUArray :: MutableByteArray# s -> Int# -> State# s -> (# State# s, e #)</div><div dir="auto">  unsafeWriteUArray :: MutableByteArray# s -> Int# -> e -> State# s -> State# s</div><div dir="auto">  unsafeIndexUArray :: ByteArray# -> Int# -> e</div><div dir="auto"><br></div><div dir="auto">And then the instances for UArray, STUArray, and IOUArray would be:</div><div dir="auto"><br></div><div dir="auto">instance Unboxed e => IArray UArray e where ...</div><div dir="auto">instance Unboxed e => MArray IOUArray e IO where ...</div><div dir="auto">instance Unboxed e => MArray (STUArray s) e (ST s) where ...</div><div dir="auto"><br></div><div dir="auto">Incidentally, this also means it'd be less effort to add instances like Unboxed CInt, Unboxed a => Unboxed (Complex a), and Unboxed Ordering.</div></div>