Haskell から C を呼ぶ (FFI)

Haskell から C 言語で書いた関数を呼ぶには。http://haskell.g.hatena.ne.jp/jmk/20060622/1150947486を見れば完璧だが、とりあえずこれだけでいいよ、という最小サンプル的な意味でメモ。

factorial.hs

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types

foreign import ccall "fact.h fact"
  c_fact :: CInt -> IO Int
main = c_fact 10 >>= print

fact.h

#ifndef __FACT_H__
#define __FACT_H__
int fact(int n);
#endif

fact.c

#include "fact.h"
int fact(int n) {
  if (n <= 1)
    return 1;
  else
    return n * fact(n-1);
}

コンパイル

$ ghc fact.c factorial.hs -o fact
$ ./fact
3628800
$              

ファイル名を fact.c と fact.hs にしたらリンクのときに名前がぶつかった。