【发布时间】:2019-05-30 05:36:20
【问题描述】:
我知道如何从 Haskell 调用纯 C++ 函数,但想知道如何让 GHC 接受有副作用的函数。
我希望 Haskell 拥有对 C++ 链表的只读访问权限,以及对 C++ 变量的独占写入访问权限。例如:
class node {
// Some other class makes a linked list out of these
int x;
node* previous;
node* next;
}
class myHaskellInterface {
node* presentLocation; // C++ decides what is regarded as current location
int getVal() {
// Haskell calls this to get information from C++
return presentLocation->x;
}
int haskellResults; // Store Haskell output here
void setVal(int x) {
// Haskell calls this to pass information back
haskellResults = x;
}
};
尽管 getVal() 没有副作用,但它是一个明显有副作用的类的一部分,所以我不清楚是否需要偷偷摸摸的技巧才能让 GHC 接受它。
setVal(int) 明明有副作用,那怎么让 GHC 不在乎呢?
【问题讨论】:
-
C 符号的 IO 类型的外部导入是否不是您想要的?您将在 cxx 文件中声明 C extern 并在 Haskell 中拥有
foreign import ccall "externed_getVal" getVal :: CxxObj -> IO CInt。 -
不,没有理由不这样。我在某处读到 FFI 函数不允许有副作用。我想我真正要问的是 1)这是真的吗 2)如果是这样,该怎么办。
-
这不是真的。
标签: haskell haskell-ffi