从 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