美好的一天!
我的项目的核心是在ST
monad中编写的,我正在尝试添加一些在C中实现的功能。我已经为所有需要的函数实现了FFI:
foreign import ccall unsafe "codec/encode.h encode_symbol"
encodeSymbol :: Ptr EncodingEnv
-> CShort -- symbol to encode
-> Ptr Context
-> IO ()
{C}例程中都修改了Context
和EncodingEnv
。我为Storable
和EncodingEnv
都有Context
个实例。简单的main
测试程序效果很好。
尽管如此,需要调用这些C例程的所有代码都放在ST
monad中。我需要将这些Ptr
存储到EncodingEnv
和Context
某处。
我应如何处理C
monad中长寿命的可变ST
结构,如何调用这些C
例程?我的建议是使用STRef (Foreign?Ptr Context)
,但我如何malloc
来自ST
的这些指针?我在任何示例或教程中都找不到它。
谢谢
答案 0 :(得分:3)
ST
monad真正用于处理Haskell分配的状态,如STRef
和STArray
。
如果您要调出的内容没有外部可见的副作用,只是操纵您将要传递的结构,那么使用unsafeIOToST
来调用它们可能“在道德上”。
您需要注意不要让指针逃脱他们使用的特定ST
计算,因为您将无法获得幻像保证的正常安全优势s
参数ST
。
使用STRef (ForeignPtr ...)
本身并没有什么帮助,但也许你可以使用一个使用幻像类型参数newtype
的{{1}}包装器来提供一些额外的自我安全性。