如何在ST monad中执行FFI调用

时间:2014-01-05 20:35:01

标签: c haskell ffi st

美好的一天!

我的项目的核心是在ST monad中编写的,我正在尝试添加一些在C中实现的功能。我已经为所有需要的函数实现了FFI:

foreign import ccall unsafe "codec/encode.h encode_symbol"
    encodeSymbol :: Ptr EncodingEnv
                 -> CShort            -- symbol to encode
                 -> Ptr Context
                 -> IO ()

{C}例程中都修改了ContextEncodingEnv。我为StorableEncodingEnv都有Context个实例。简单的main测试程序效果很好。

尽管如此,需要调用这些C例程的所有代码都放在ST monad中。我需要将这些Ptr存储到EncodingEnvContext某处。

我应如何处理C monad中长寿命的可变ST结构,如何调用这些C例程?我的建议是使用STRef (Foreign?Ptr Context),但我如何malloc来自ST的这些指针?我在任何示例或教程中都找不到它。

谢谢

1 个答案:

答案 0 :(得分:3)

ST monad真正用于处理Haskell分配的状态,如STRefSTArray

如果您要调出的内容没有外部可见的副作用,只是操纵您将要传递的结构,那么使用unsafeIOToST来调用它们可能“在道德上”。

您需要注意不要让指针逃脱他们使用的特定ST计算,因为您将无法获得幻像保证的正常安全优势s参数ST

使用STRef (ForeignPtr ...)本身并没有什么帮助,但也许你可以使用一个使用幻像类型参数newtype的{​​{1}}包装器来提供一些额外的自我安全性。