
foreign import "nameOfFunction" nameOfFunction :: IO MyType
Is it possible to write a new MyType and make it allowed as a return type from foreign functions? Is changing the compiler the only way to do that?
Of course you're not really returning a MyType but a pointer to one. (...)
This would solve half my problem. Can I always trust that? I've been told before that everytime a C function returns a struct it is actually returning a pointer, but I wasn't able to find that written in stone so that I can trust it to be valid anywhere Haskell will run and for any return type (like a struct containing just a char, for instance). How does that pointer work? My code didn't provide it to the C function, so, I believe I don't have to deallocate it. Where does the memory it points to live? Did Haskell FFI engine gave that pointer to the C function? How much time is it going to live? Enough so I can 'peek' it?
Using raw Ptrs is not very nice, so we would usually either wrap that in a ForeignPtr or use a Storable instance to get a MyType directly.
OK. I've instances of Storable for all the appropriate types.
If do recommend reading the FFI spec. It's quite readable and explains a lot of the issues.
Sure. It helped a lot. Actually, I've been able to do everything I needed so far with just the spec and Foreign.*.
I would also add the chapter 17 of Real World Haskell. you can read it here:
Nice. It shows unsafePerformIO. Some functions returning structs are side effect free. I'm writing bindings I want to put on hackage, so what do you think would fit better the taste of Haskell programmers: pure functions using unsafePerformIO or IO functions? Thanks, MaurĂcio