将Ptr()转换为SourceCompletionProvider

时间:2012-09-20 09:08:11

标签: haskell gtk2hs

我已部分解决了prev个问题。

现在我可以通过GObject注册bindings-gobject子类型了(参见hpase) 我可以使用c'g_type_add_interface_static函数实现SourceCompletionProvider(但尚未尝试过)。

唯一的问题是将Ptr ()返回的c'g_object_newv转换为gtk2hs数据类型SourceCompletionProvider。我该怎么做?任何提示?

SourceCompletionProvider的定义如下:

newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))

这个定义是什么意思?为什么它是递归的?提供商是ForeignPtr提供商 - 对我来说很奇怪。

感谢。

解决方案:

makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr

1 个答案:

答案 0 :(得分:1)

外部SourceCompletionProvider是必需的,因为这是一个新类型,而内部SourceCompletionProvider只是区分这个外部指针和指向其他类型的指针的标记。如果您查看definition of Ptr a,它是data Ptr a = Ptr Addr# - a是一个未出现在右侧的幻像类型,因此该定义实际上不是递归的。

您可以使用newForeignPtr_Ptr ()转换为ForeignPtr (),然后使用castForeignPtr将其转换为ForeignPtr SourceCompletionProvider

修改:仔细观察后,我认为为了完成这项工作,您需要先使用所概述的方法将Ptr转换为GObject上面然后使用unsafeCastGObject。但是没有经过测试。