Hatena::ブログ(Diary)

Hatena’s Kitchen RSSフィード

2009-02-01 首が痛い

HaskellのFFIはとっても簡単

| 23:19 |  HaskellのFFIはとっても簡単を含むブックマーク

Real World Haskell読書メモが停滞していますが、読む方は地道に進んでいます。

今17章のFFIのところ。

FFIとは、Foreign Function Interfaceの略で、Haskellプログラムの中で他の言語関数を読んだり、その逆をしたりといった話。

本の中では、HaskellからCの関数を呼ぶ話がメインです。

一読しかしてなくて、まだわかっていないところも多くあるのだけれど、例えばCで書いたHello WorldHaskellから呼び出すのはとっても簡単です。

用意するファイルは3つ。

hello.h
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>

void hello(void);

#endif /* HELLO_H */
hello.c
#include "hello.h"

void hello(void)
{
    printf("Hello World!\n");
}
Hello.hs
{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign

foreign import ccall "hello.h hello" c_hello :: IO ()

要点は、foreign import 〜というところ。

hello.hというヘッダにある、helloという関数Haskell世界で、 c_hello :: IO ()というアクションとして使いますよ。という感じのことを宣言しています。

hello関数は、副作用を起こして、何も返さないので、haskell世界での型はIO () となるわけです。

使い方も簡単。

$ gcc -c hello.c
$ ghci Hello.hs hello.o
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Loading object (static) hello.o ... done
final link ... done
[1 of 1] Compiling Main             ( Hello.hs, interpreted )
Ok, modules loaded: Main.
*Main> c_hello
Hello World!
*Main> 

感動すら覚える簡単さ。PerlでXSを覚えるよりもはるかにラクですね。

Cの関数引数が多くなったり、呼び出す順序に暗黙の制約があったりしますが、Haskellでbindingを書いてやることで、直感的に使いやすいインターフェースに改良することができます。

てなところが大きな強みだなぁと思っています。

トラックバック - http://d.hatena.ne.jp/tom-lpsd/20090201/1233497971