我写了一个简单的haskell模块,我可以将其转换为共享库:
{-# LANGUAGE ForeignFunctionInterface #-}
module Safe where
import Foreign.C.Types
add :: Int -> Int -> Int
add p q = p + q
hs_add :: CInt -> CInt -> CInt
hs_add a b = fromIntegral (add (fromIntegral a) (fromIntegral b))
foreign export ccall hs_add :: CInt -> CInt -> CInt
Run Code Online (Sandbox Code Playgroud)
用命令
ghc -O2 -dynamic -shared -fPIC -o libAdd.so Add.hs -lHSrts-ghc8.2.2
Run Code Online (Sandbox Code Playgroud)
以下程序工作正常:
#include <stdio.h>
#include <dlfcn.h>
#include <HsFFI.h>
#define _LIB_INIT
int main(int argc, char *argv[])
{
void* handle;
static char …Run Code Online (Sandbox Code Playgroud) 在关于FFI的GHC手册部分中,声明程序员可以使用newtype在IO monad周围创建一个包装器monad,并在调用外部代码时使用它来代替IO monad.(GHC手册)
到目前为止,我有:
newtype PGm a = PGm (IO a)
instance Monad PGm where
(>>=) a b = ...
(>>) a b = ...
return a = PGm (return a) --I think
fail a = PGm (fail a) --I think
Run Code Online (Sandbox Code Playgroud)
关于如何实施(>>=)和实施,我感到很茫然(>>).