是否可以将两个gobjects与haskell-gi进行比较并找出它们是否相同?

时间:2017-05-24 17:03:16

标签: haskell gtk3

使用Gtk2Hs,我曾经能够将gtk对象与==进行比较,以确定它们是否相同。例如:

boxIsFromState :: VBox -> State -> Bool
boxIsFromState widget state = _widget state == widget

其中State是自定义数据类型容器的另一个VBox。

我注意到haskell-gi的小部件并非来自Eq。还有另一种比较对象的方法吗?

1 个答案:

答案 0 :(得分:3)

免责声明:虽然我是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'

或类似的。