我对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在后台执行的,它们仅用于使foreign import …
FFI声明更安全。如果不是写{#pointer ...}
声明,而是写上面生成的data HaskellName ..
声明(即,不使用C2HS),那么GHC不会强制执行C到Haskell类型的关联(我假设)。
最后,如果我们删除上述*
声明中的{#pointer …}
字符,那么我们将不再具有*CTypeName ~ HaskellName
和*CTypeName ~ (Ptr HaskellName)
之间的类型对应关系,而将具有类型对应关系在CTypeName ~ HaskellName
和CTypeName ~ (Ptr HaskellName)
之间。
我所有的理解正确吗?