如何使用hsc2hs绑定到常量,函数和数据结构?

dev*_*vel 8 haskell ffi hsc2hs

我需要一个例子如何使用hsc2hs,我想当我写一个头文件,如:

// foo.h
#define PI 3.14159

typedef struct {
    int i1;
    int i2;
} foo;

struct foo2 {
    int i1;
    int i2;
};

int fooFkt(foo f);
Run Code Online (Sandbox Code Playgroud)

然后创建一个像以下一样的hsc文件:

import Foreign
import Foreign.C

#include "foo.h"
Run Code Online (Sandbox Code Playgroud)

用途hsc2hs:

{-# INCLUDE "foo.h" #-}
{-# LINE 1 "test.hsc" #-}
import Foreign
{-# LINE 2 "test.hsc" #-}
import Foreign.C


{-# LINE 5 "test.hsc" #-}
Run Code Online (Sandbox Code Playgroud)

我不明白,我认为帽子hsc2hs会像我一样为我导入所有需要的东西 PI

谁能给我一个更好的例子?

Don*_*art 9

在RWH ch 17之后,你需要引入一些将C PI值绑定到Haskell中的符号的东西.

例如:

{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE CPP                      #-}

import Foreign
import Foreign.C

-- helpers
import Control.Applicative
import Control.Monad

#include "foo.h"

-- binding a symbol

-- Note that hsc2hs can't marshal floating point CPP values, so this will be "3"
-- c_pi :: CInt
-- c_pi = #const PI

-- Instead, bind to a function that returns a CFloat
pi' :: Float
pi' = realToFrac c_pi

foreign import ccall unsafe "my_pi" c_pi :: CFloat
Run Code Online (Sandbox Code Playgroud)

当我们在这里时,我们也可以在Haskell之间编组结构:

-- Marshalling for the struct foo

data Foo = Foo { i1, i2 :: Int }
    deriving Show

-- Define how to marshal foo structs

instance Storable Foo where
    sizeOf    _ = #{size foo}

    alignment _ = alignment (undefined :: CInt)

    poke p foo  = do
        #{poke foo, i1} p $ i1 foo
        #{poke foo, i2} p $ i2 foo

    peek p = return Foo
              `ap` (#{peek foo, i1} p)
              `ap` (#{peek foo, i2} p)
Run Code Online (Sandbox Code Playgroud)

并绑定到fooFkt功能:

-- Import the function too

foreign import ccall "foo.h fooFkt"
    c_fooFkt :: Ptr Foo -> IO CInt

-- Marshal data to and from C

fooFkt :: Foo -> IO Int
fooFkt f = fromIntegral <$> with f c_fooFkt
Run Code Online (Sandbox Code Playgroud)

完成.

  • 不绑定-dsl提供一些浮点常量#defines?#fractional或类似的东西? (2认同)
  • bindings-dsl为您提供了一大堆其他非常有用的东西.我强烈推荐它:https://bitbucket.org/mauricio/bindings-dsl/wiki/DetailedUsageGuide (2认同)