Don Stewart ha scritto:
[...]
You also have to add instance for UIO:

    instance (RealFloat a, UIO a) => UIO (Complex a) where
        hPutU h (UAComplex arr) = hPutU h arr
        hGetU h                 = do arr <- hGetU h
                                     return (UAComplex arr)


With Storable, this should not be required; you just have to write an instance for the Storable class.


Though you get no IO operations with Storable... UIO is entirely
separate.


Yes, but using Storable and Foreign.Ptr, IO is rather simple.
From storablevector package:

-- | Outputs a 'Vector' to the specified 'Handle'.
hPut :: (Storable a) => Handle -> Vector a -> IO ()
hPut h v =
   if null v
     then return ()
     else
       let (fptr, s, l) = toForeignPtr v
       in  withForeignPtr fptr $ \ ptr ->
              let ptrS = advancePtr ptr s
                  ptrE = advancePtr ptrS l
                  -- use advancePtr and minusPtr in order to respect
                  -- alignment
              in  hPutBuf h ptrS (minusPtr ptrE ptrS)

-- | Read a 'Vector' directly from the specified 'Handle'.  This
-- is far more efficient than reading the characters into a list
-- and then using 'pack'.
--
hGet :: (Storable a) => Handle -> Int -> IO (Vector a)
hGet _ 0 = return empty
hGet h i =
   createAndTrim i $ \p ->
      let elemType :: Ptr a -> a
          elemType _ = undefined
          sizeOfElem = sizeOf (elemType p)
      in  fmap (flip div sizeOfElem) $
          hGetBuf h p (i * sizeOfElem)


Regards  Manlio
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to