從 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