From Haskell, I want to call a C function that returns a struct by value (rather than, say, returning a pointer). For example:

  typedef struct { double x; double y; } point_t;
  point_t polar(double theta);

I can create a Haskell type Point and make it an instance of Storable easily enough:

  data Point = Point CDouble CDouble
  instance Storable Point where -- insert obvious code here

And now I want to do something like this:

  foreign import ccall unsafe polar :: CDouble -> IO Point

...but that doesn't appear to be legal (at least in GHC 6.12). Is there any way to import this C function into Haskell _without_ having any additional wrapper C code? I mean, I suppose I could write something like:

  // C:
  void polar_wrapper(double theta, point_t* output) {
    *output = polar(theta);
  }
  -- Haskell:
foreign import ccall unsafe polar_wrapper :: CDouble -> Ptr Point - > IO ()
  polar :: CDouble -> IO Point
  polar theta = do -- insert obvious code here

...but that's a lot of extra boilerplate if I have many such functions to wrap, and it seems like GHC should be able to do that sort of thing for me. P-:

Cheers,
-Matt


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to