從 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