Haskell 将Ptr()转换为SourceCompletionProvider
我已经部分地解决了这个问题 现在,我可以通过Haskell 将Ptr()转换为SourceCompletionProvider,haskell,gtk2hs,Haskell,Gtk2hs,我已经部分地解决了这个问题 现在,我可以通过绑定GObject注册GObject子类型(请参阅) 我可以使用函数实现SourceCompletionProvider(但尚未尝试) 唯一的问题是将c'g_object_newv返回的Ptr()转换为gtk2hs数据类型SourceCompletionProvider。我怎么做?有什么提示吗 SourceCompletionProvider的定义如下: newtype SourceCompletionProvider = SourceCompleti
绑定GObject
注册GObject
子类型(请参阅)
我可以使用函数实现SourceCompletionProvider
(但尚未尝试)
唯一的问题是将c'g_object_newv
返回的Ptr()
转换为gtk2hs
数据类型SourceCompletionProvider
。我怎么做?有什么提示吗
SourceCompletionProvider
的定义如下:
newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))
这个定义是什么意思?为什么它是递归的?提供者是提供者的外来PTR
——对我来说很奇怪
谢谢
解决方案:
makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr
makeNewGObject mkGObject$castPtr c'g_object_newv myObType 0 nullPtr
外部的SourceCompletionProvider
是必需的,因为这是一个新类型,而内部的SourceCompletionProvider
只是一个标记,用于区分此外部指针与指向其他类型的指针。如果您查看,它是data Ptr a=Ptr Addr#
-a
是一种幻影类型,不会出现在右侧,因此定义实际上不是递归的
您可以使用将Ptr()
转换为ForeignPtr()
,然后使用将其转换为ForeignPtr SourceCompletionProvider
编辑:在详细了解了这一点之后,我认为要实现这一点,您需要首先使用上述方法将
Ptr
转换为GObject
,然后使用unsecastgobject
。但未测试。外部SourceCompletionProvider
是必需的,因为这是一个新类型,而内部SourceCompletionProvider
只是一个标记,用于区分此外部指针与指向其他类型的指针。如果您查看,它是data Ptr a=Ptr Addr#
-a
是一种幻影类型,不会出现在右侧,因此定义实际上不是递归的
您可以使用将Ptr()
转换为ForeignPtr()
,然后使用将其转换为ForeignPtr SourceCompletionProvider
编辑:在详细了解了这一点之后,我认为要实现这一点,您需要首先使用上述方法将
Ptr
转换为GObject
,然后使用unsecastgobject
。不过,没有经过测试。嗯。。。我想我需要添加终结器,对吗?我可以用p'g_object\u unref
作为终结器,这足够了吗?从我看了之后可以看出,你是对的。嗯。。。我想我需要添加终结器,对吗?我可以使用p'g_object\u unref
作为终结器,这足够了吗?从我看到的情况来看,你是对的。