1 2 3 4 5 6 7 8 9 10 11 12 | syncWithC :: MVar CInt -> CInt -> IO () syncWithC m x = do putMVar m x return () foreign import ccall "wrapper" syncWithCWrap :: (CInt -> IO ()) -> IO (FunPtr (CInt -> IO ())) main = do m <- newEmptyMVar -- create a partial function with mvar m already applied. Pass to C. C will back with CInt f <- syncWithCWrap $ syncWithC m |