I'm not sure I understand you, but I think what you're asking is "how do I create a C wrapper of a Haskell function, so that I can pass it to an imported C function"? If that indeed is what you're asking, then allow me to post a real-world example of how to do this: -- create wrapper type StreamCallback = Ptr CSoundStream -> Ptr () -> CInt -> Ptr () -> IO CSChar foreign import ccall "wrapper" mkStreamCallbackRaw :: StreamCallback -> IO (FunPtr StreamCallback) -- the function which uses the wrapper foreign import ccall "fmod.h FSOUND_Stream_SetEndCallback" fsound_StreamEndCallbackRaw :: Ptr CSoundStream -> FunPtr StreamCallback -> Ptr () -> IO CSChar Then you can just call: do callback <- mkStreamCallbackRaw myHaskellCallbackFunction c <- fsound_StreamEndCallbackRaw soundStream callback nullPtr /S On Thu, 17 Mar 2005 14:11:31 -0600, John Goerzen <jgoerzen@complete.org> wrote:
Hi,
I'm trying to make a Haskell binding for the FUSE library, http://fuse.sourceforge.net/. The FUSE concept is centered around a struct whose members are pointers to callback functions.
Here's the problem: the functions I want to callback to have types like this:
vGetLine :: HVFS a -> a -> IO String
Now, I can't just pass some sort of opaque pointer to C, because then the exact type of a would be lost.
Is there any other method I might try?
Thanks,
John _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Sebastian Sylvan +46(0)736-818655 UIN: 44640862