On 01-Aug-2002, Hal Daume III <hdaume@ISI.EDU> wrote:
Okay, I'm dumb and can't figure this out. I'm migrating hMPI from GHC 4.08 to GHC 5.04 (fun fun) and am having trouble writing an instance of Storable. The relevant information is:
import Foreign.Storable type MPI_Rank_Type = Int newtype MPI_Rank = MPI_Rank MPI_Rank_Type deriving (Eq)
instance Storable MPI_Rank where sizeOf (MPI_Rank r) = sizeOf r alignment (MPI_Rank r) = alignment r peek addr = do r <- peek addr return (MPI_Rank r) poke addr (MPI_Rank r) = poke addr r
which doesn't work [...] I have no idea what's wrong. if i make it "...do (r :: Int) <- ..." it complains: [...] it's like it doesn't realize that "peek" is part of the class and can be overloaded.
The argument type for `peek' has changed from `Addr' (or something like that) to a parameterized type `Ptr a'. So the problem is essentially that your `peek' method takes a parameter of type `Ptr MPI_Rank', but needs to call `peek' with a parameter of type `Ptr MPI_Rank_Type'. You need to use `castPtr' to convert between the two pointer types. I think the following (untested) code should do it: peek addr = do r <- peek (castPtr addr) return (MPI_Rank r) Likewise for `poke'. -- Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit The University of Melbourne | of excellence is a lethal habit" WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.