Pointers C2HS指针类型对应关系

Pointers C2HS指针类型对应关系,pointers,haskell,ffi,c2hs,Pointers,Haskell,Ffi,C2hs,关于C2HS如何从{#pointer…}声明生成类型对应,我有一些概念性的问题。首先,让~表示C类型和Haskell类型之间的类型对应运算符。那么这样说对吗 {#pointer *CTypeName as HaskellName newtype#} 生成对应关系*CTypeName~HaskellName,而 {#pointer *CTypeName as HaskellName foreign newtype#} 生成对应关系*CTypeName~(Ptr HaskellName)?(如果

关于C2HS如何从
{#pointer…}
声明生成类型对应,我有一些概念性的问题。首先,让
~
表示C类型和Haskell类型之间的类型对应运算符。那么这样说对吗

{#pointer *CTypeName as HaskellName newtype#}
生成对应关系
*CTypeName~HaskellName
,而

{#pointer *CTypeName as HaskellName foreign newtype#}
生成对应关系
*CTypeName~(Ptr HaskellName)
?(如果是,这是否意味着在后一种情况下,
CTypeName~HaskellName
也会这样做?)

尽管C2HS会为每个不同的声明生成稍有不同的类型定义:

-- {#pointer *CTypeName as HaskellName newtype#}
data HaskellName = HaskellName (Ptr HaskellName)

-- {#pointer *CTypeName as HaskellName foreign newtype#}
data HaskellName = HaskellName (ForeignPtr HaskellName)
我上面提到的
~
通信是GHC/C2HS在后台以某种方式强制执行的,它们只用于使
外国进口…
外国金融机构声明更安全。如果我们不写
{#pointer…}
声明,而是像上面那样写它们生成的
数据Haskell name..
声明(即,不使用C2HS),那么GHC就不会强制执行C-to-Haskell类型的关联(我假设)

最后,如果我们删除上述
{#pointer…}
声明中的
*
字符,那么我们就不用在
*CTypeName~HaskellName
*CTypeName~(Ptr HaskellName)
之间建立类型对应关系了,我们将在
CTypeName~HaskellName
CTypeName~(Ptr HaskellName)
之间建立类型对应关系

我的理解都正确吗