[Haskell-cafe] allocation for "pure" FFI functions

Duncan Coutts duncan.coutts at googlemail.com
Fri Oct 15 04:07:22 EDT 2010


On Thu, 2010-10-14 at 17:45 +0000, Johannes Waldmann wrote:
> Hi. I wonder how to do the following properly.
> 
> I have one (large) C  type, let's call it T,
> and I want to sell it as an abstract type in Haskell.
> 
> I want to use C functions as if they were of type T -> T  
> (pure function, returns a modified copy of the input)
> and the question is, how to do the memory allocation for that,
> in particular, how to avoid  IO  showing up 
> in the (visible) types on the Haskell side:
> 
> I don't want IO because I don't want to declare some artificial
> order of execution - instead I want lazy evaluation.
> E.g., I might have some Haskell record with a T component
> which may or may not be evaluated (accessed) at all.

It is exactly for this purpose that the Haskell FFI library includes
unsafePerformIO. This is basically *the* legitimate use case for it, so
you don't need to feel bad about it.

The FFI spec says:

        Sometimes an external entity is a pure function, except that it
        passes arguments and/or results via pointers. To permit the
        packaging of such entities as pure functions, Foreign provides
        the following primitive: 
        
        unsafePerformIO :: IO a -> a

http://www.cse.unsw.edu.au/~chak/haskell/ffi/ffi/ffise5.html#x8-240005.1


Duncan



More information about the Haskell-Cafe mailing list