wvogel日記

自分用の技術備忘録が多めです.

FFI

さあ。
昨日できなかった、FFIのテスト
C言語関数をHaskellで利用する。
逆は考えません、Haskellを活かせない気がする。


ネットで調べてみると、sin関数をCから引っ張ってくるものがあったのでそれでちょっと簡単な実験をすることに

{-# LANGUAGE ForeignFunctionInterface #-}
module FFI where

foreign import ccall "math.h sin"
    c_sin :: Double -> Double

これを、FFI.hsとして保存。
まずはGHCiで試してみます

ghci FFI.hs -lm

としてやるとロード完了。
これで関数が利用できる!!


なるほどなるほど
cosも同様に利用できますね!


ただ、これではHaskellの提供する型を利用しているのであまりよろしくない。というのも、言語によって同じ型でも数の範囲や精度が違うし、やはり言語自体が提供する型で実装四他方が良いでしょう。
Haskellでは、Cの提供する型は
Foreign.C.Types
で参照できます。


というわけで
先ほどのものを書き直す

{-# LANGUAGE ForeignFunctionInterface #-}
module FFI where
import Foreign.C.Types

foreign import ccall "math.h cos"
    c_cos :: CDouble -> CDouble

これで、Haskellから呼び出せる!
ちなみに、先ほどの関数を、単独で動くようにしてみた

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

foreign import ccall "math.h cos"
    c_cos :: CDouble -> CDouble

main = putStr $ unlines $ map (show.c_cos) [0.0,2.0..90.0]

これでよし!!


また、Cでの構造体を扱う方法もあるみたい
→ttp://itpro.nikkeibp.co.jp/article/COLUMN/20080805/312151/?ST=develop&P=3
ここをソースにして実験したので、また今度勉強してみるか。


ただ、それではHaskell使う意味がないんですけどね笑
Haskellらしい書き方を身につけるためにも外部関数は使うつもりないけれど、参考として覚えておこう。
いつか使う日がくるかもしれない
あ!例えば、HaskellとCという、別言語で数人で開発する時とかかな