是否可以用 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
  }

导出所有合适的构造函数,ForeignPtrIORef 都提供 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'

或类似的。