ANN: H98 FFI Addendum 1.0, Release Candidate 10
Ross Paterson
ross at soi.city.ac.uk
Tue Jun 24 19:45:32 EDT 2003
The new wording:
\code{unsafePerformIO} may compromise typing; to avoid this, the programmer
should ensure that the result of \code{unsafePerformIO} has a monomorphic
type.
rules out the following:
my_hash :: Storable a => a -> Int
my_hash a = fromIntegral $ unsafePerformIO $
allocaBytes (sizeof a) $ \p -> do
let size = fromIntegral (sizeOf a)
c_memset p 0 size
poke p a
hash_bytes p size
foreign import ccall unsafe "memset"
c_memset :: Ptr a -> CInt -> CSize -> IO ()
foreign import ccall unsafe
hash_bytes :: Ptr a -> CSize -> IO CInt
I still claim that the problem isn't polymorphism itself, but creating
polymorphic references, and that is always environment dependent.
Manuel writes:
> However, it is possible to construct examples that are deterministic,
> but still dubious from a typing perspective. Let's assume a C routine
>
> void *foo();
>
> that *always returns the same pointer* to a buffer area. To
> bind this in Haskell as
>
> foreign import ccall foo :: Ptr a
>
> is problematic[1].
(a) It's constant across a run of the program, but its value still depends
on the environment, and
(b) the declaration contains incorrect type information.
More information about the FFI
mailing list