是否可以用 haskell-gi 比较两个 gobject 并确定它们是否相同?
Is it possible to compare two gobjects with haskell-gi and find out if they're the same?
使用 Gtk2Hs,我曾经能够将 gtk 对象与 ==
进行比较,以确定它们是否相同。例如:
boxIsFromState :: VBox -> State -> Bool
boxIsFromState widget state = _widget state == widget
其中State
是自定义数据类型容器另一个VBox。
我注意到 haskell-gi
的小部件并非源自 Eq
。那么还有其他比较对象的方法吗?
免责声明:虽然我是Haskell专家,但我对haskell-gi知之甚少。也就是说...
查看文档,我们有:
newtype Widget = Widget (ManagedPtr Widget)
data ManagedPtr a = ManagedPtr {
managedForeignPtr :: ForeignPtr a
, managedPtrIsOwned :: IORef Bool
}
导出所有合适的构造函数,ForeignPtr
和 IORef
都提供 Eq
个实例。所以编写我们自己的 Eq
实例应该是微不足道的——如此微不足道以至于编译器本身应该能够做到这一点。
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Eq (ManagedPtr a)
deriving instance Eq Widget
我不是 100% 清楚这是否具有正确的语义;出于相等性测试的目的,您可能希望忽略所有权,在这种情况下,您可能希望编写
instance Eq (ManagedPtr a) where
(==) ManagedPtr { managedForeignPtr = p }
ManagedPtr { managedForeignPtr = p' }
= p == p'
或类似的。
使用 Gtk2Hs,我曾经能够将 gtk 对象与 ==
进行比较,以确定它们是否相同。例如:
boxIsFromState :: VBox -> State -> Bool
boxIsFromState widget state = _widget state == widget
其中State
是自定义数据类型容器另一个VBox。
我注意到 haskell-gi
的小部件并非源自 Eq
。那么还有其他比较对象的方法吗?
免责声明:虽然我是Haskell专家,但我对haskell-gi知之甚少。也就是说...
查看文档,我们有:
newtype Widget = Widget (ManagedPtr Widget)
data ManagedPtr a = ManagedPtr {
managedForeignPtr :: ForeignPtr a
, managedPtrIsOwned :: IORef Bool
}
导出所有合适的构造函数,ForeignPtr
和 IORef
都提供 Eq
个实例。所以编写我们自己的 Eq
实例应该是微不足道的——如此微不足道以至于编译器本身应该能够做到这一点。
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Eq (ManagedPtr a)
deriving instance Eq Widget
我不是 100% 清楚这是否具有正确的语义;出于相等性测试的目的,您可能希望忽略所有权,在这种情况下,您可能希望编写
instance Eq (ManagedPtr a) where
(==) ManagedPtr { managedForeignPtr = p }
ManagedPtr { managedForeignPtr = p' }
= p == p'
或类似的。