
At the moment, I have a user defined data type on which I have defined some operations, instantiated (not derived) Eq and so on. However, for efficiency I'm storing the actual data in UArrays of Word8. In order for everything to work, I need functions 'toW8' and 'fromW8' to map between the data type and its representation in the array. I gather it is impossible to hide the 'Eq' instance of Word8 and/or redefine it, but could this be circumvented by instead of data Foo = F | G instance Eq Foo where F == _ = True _ == _ = False defining something like newtype Foo = F Word8 f, g, h :: Foo f = F 0 g = F 1 and using the same instance declaration? And will it still fit into a UArray? (It is of course possible that, while profiling indicates otherwise, the conversion functions have little impact in practice; i.e. the optimizer will do away with them.) -kzm -- If I haven't seen further, it is by standing in the footprints of giants

If I'm understanding you correctly, you just want to be able to put F|Gs into an unbooxed array. You don't need to do this conversion stuff...you can just define new instances. Something like: instance MArray IOUArray F IO where newArray (l,h) f = newArray (l,h) (f==F) >>= castIOUArray newArray_ (l,h) = do (arr :: IOUArray ix Bool) <- newArray_ (l,h) castIOUArray arr unsafeRead arr i = do arr' <- castIOUArray arr b <- unsafeRead arr' i return (if b then F else G) unsafeWrite arr i f = castIOUArray arr >>= \arr' -> unsafeWrite arr' i (f==F) here we have represented Fs by their isomorphic type Bool, which already has MArray instances. HTH - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On 2 Oct 2002, Ketil Z. Malde wrote:
At the moment, I have a user defined data type on which I have defined some operations, instantiated (not derived) Eq and so on. However, for efficiency I'm storing the actual data in UArrays of Word8.
In order for everything to work, I need functions 'toW8' and 'fromW8' to map between the data type and its representation in the array.
I gather it is impossible to hide the 'Eq' instance of Word8 and/or redefine it, but could this be circumvented by instead of
data Foo = F | G
instance Eq Foo where F == _ = True _ == _ = False
defining something like
newtype Foo = F Word8 f, g, h :: Foo f = F 0 g = F 1
and using the same instance declaration? And will it still fit into a UArray?
(It is of course possible that, while profiling indicates otherwise, the conversion functions have little impact in practice; i.e. the optimizer will do away with them.)
-kzm -- If I haven't seen further, it is by standing in the footprints of giants _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (2)
-
Hal Daume III
-
ketil@ii.uib.no