从 Haskell 调用 C 语言

出于性能原因,或者由于存在成熟的 C 库,你可能希望从 Haskell 程序中调用 C 代码。下面是一个简单的示例,说明如何将数据传递到 C 库并获得答案。

foo.c 的:

#include <inttypes.h>

int32_t foo(int32_t a) {
  return a+1;
}

Foo.hs:

import Data.Int

main::IO ()
main = print =<< hFoo 41

foreign import ccall unsafe "foo" hFoo::Int32 -> IO Int32

unsafe 关键字生成的调用比安全更高效,但要求 C 代码永远不会回调 Haskell 系统。由于 foo 完全在 C 中并且永远不会调用 Haskell,我们可以使用 unsafe

我们还需要指示 cabal 在 C 源代码中编译和链接。

foo.cabal:

name:                foo
version:             0.0.0.1
build-type:          Simple
extra-source-files:  *.c
cabal-version:       >= 1.10

executable foo
  default-language: Haskell2010
  main-is:       Foo.hs
  C-sources:     foo.c
  build-depends: base

然后你可以运行:

> cabal configure
> cabal build foo
> ./dist/build/foo/foo
42