[Haskell-cafe] Selecting Array type

Jeff φ jeff1.61803 at gmail.com
Tue Feb 19 10:49:03 EST 2008


I'm trying to create a type called SmartArray.  It is a type synonym for an
array.  If the element type can be unboxed, then SmartArray is an unboxed
array.  Otherwise, it is a boxed array.

For instance,

(SmartArray Int Double) is the same as (UArray Int Double)
(SmartArray Int String) is the same as (Array Int String)

However, my implementation of SmartArray requires me to create an instance
of a selector class to tell the compiler wheither the type is boxed or
unboxed.  I'm hoping to avoid creating instances of the selector class for
every possible type.  I'd be grateful for any suggestions.

Please see my code:

{-# OPTIONS_GHC
    -fglasgow-exts
    -fbreak-on-exception
    -XOverlappingInstances
#-}

import Data.Ix
import Data.Array.Unboxed
import Data.Complex

type SmartArray i e = (Ix i, SmartArraySelector a e) => (a i e)

-- smartArray is similar to array function from Data.Array. But, it
-- will return a UArray if e can be unboxed.  Otherwise, it returns an
Array.

smartArray :: (i, i) -> [(i, e)] -> SmartArray i e
smartArray bnd eLst = array bnd eLst


class (IArray a e) => SmartArraySelector a e | e -> a where
    arrayType :: Ix i => a i e -> a i e
    arrayType = id

-- SmartArraySelector selects UArray for all types that can be
-- unboxed.  An instance has to be created for each unboxed type.  I'd
-- like to avoid listing all unboxed types here.  However, since there
-- are only a few unboxed types, it's not too burdensome to list them
-- all.  (For brevity, I didn't create all possible instances.)

instance SmartArraySelector UArray Bool   where
instance SmartArraySelector UArray Char   where
instance SmartArraySelector UArray Double where
instance SmartArraySelector UArray Float  where
instance SmartArraySelector UArray Int    where


-- SmartArraySelector selects Array for all types that can't be
-- unboxed.  An instance has to be created for EVERY possible unboxed
-- type that might be used with SmartArray.  Since, the list of
-- possible types is unlimited, this is pretty annoying.

instance SmartArraySelector Array String where
instance SmartArraySelector Array (Complex e) where


-- I'd like to replace all the boxed instances above with one instance
-- like . . .
--
-- instance SmartArraySelector Array e where
--
-- However, this generates an error even though,
-- -XOverlappingInstances turned on.

test e = smartArray (0,10) [ (i,e) | i <- [0..10]]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080219/34508bbc/attachment.htm


More information about the Haskell-Cafe mailing list