小编Ed *_*ehn的帖子

为什么必须从共享库调用hs_init(不是静态链接)

我写了一个简单的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)

haskell ffi

7
推荐指数
0
解决办法
152
查看次数

创建haskell IO包装器

在关于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)

关于如何实施(>>=)和实施,我感到很茫然(>>).

haskell io-monad

3
推荐指数
1
解决办法
61
查看次数

标签 统计

haskell ×2

ffi ×1

io-monad ×1