1

再会!

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

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

两者ContextEncodingEnv都在 C 例程中进行了修改。我有两个和的工作Storable实例。简单的测试程序运行良好。EncodingEnvContextmain

尽管如此,所有需要调用这些 C 例程的代码都位于STmonad 中。我需要将这些Ptrs存储EncodingEnvContext某个地方。

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

谢谢

4

1 回答 1

3

STmonad 真正适用于使用 Haskell 分配的状态,例如STRefSTArray

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

您需要注意不要让指针逃脱ST它们所使用的特定计算,因为您不会获得由 phantoms参数保证的正常安全优势ST

使用STRef (ForeignPtr ...)本身并没有真正的帮助,但也许您可以使用一个newtype使用幻像类型参数的包装器s来提供一些额外的自我强加的安全性。

于 2014-01-05T20:51:07.430 回答