'C'のwiringPiライブラリには、次のタイプの関数があります。
extern void (*pinMode) (int pin, int mode) ;
FunPtrでFFIを使用してhaskellから呼び出してみました。だから私はしました、
foreign import ccall unsafe "wiringPi.h &pinMode" c_pinMode
:: FunPtr (CInt -> CInt -> IO ())
foreign import ccall "dynamic" dc_pinMode
:: FunPtr (CInt -> CInt -> IO ()) -> (CInt -> CInt -> IO ())
しかし、何らかの理由で、コンパイルしても、「pinMode」が指す関数を呼び出していないようです。
そこで、通常のForeign.Ptrを使用してみました。これは、Ptrを覗いて、「pinMode」が指す基になる「C」関数への参照を取得できる可能性があると考えたためです。だから私は試しました、
foreign import ccall "wiringPi.h &pinMode" c_pinMode
:: Ptr (Ptr (CInt -> CInt -> IO ()))
次に、「pinMode」を呼び出すhaskell関数の実装で、peekを2回使用して、基になる関数への参照を取得しました。(CInt -> CInt -> IO ())
しかし、コンパイラが型の関数が「保存可能な」型クラスのインスタンスではないと私に言う場合、コンパイルエラーが発生し続けます。
そこで、保存可能な型クラスをチェックして、保存可能な型クラス(CInt -> CInt -> IO ())
のインスタンスを作成しました。必要な最小限の実装は、ピーク、ポーク、およびその他のいくつかの関数です。ポインタによる参照です。
根本的な何かが欠けているような気がします。誰かが私を正しい方向に向けてくれませんか?
よろしくお願いします