是否可以将两个GObject与haskell gi进行比较,并找出它们是否';你是一样的吗?

是否可以将两个GObject与haskell gi进行比较,并找出它们是否';你是一样的吗?,haskell,gtk3,Haskell,Gtk3,使用Gtk2Hs,我曾经能够将gtk对象与==进行比较,以确定它们是否相同。例如: boxIsFromState :: VBox -> State -> Bool boxIsFromState widget state = _widget state == widget 其中,State是一个自定义的数据类型容器,它是另一个VBox 我注意到haskell-gi的小部件不是从Eq派生的。那么,还有其他方法来比较对象吗?免责声明:尽管我是Haskell专家,但我对Haskell gi

使用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'

或者类似的。

哦,太好了!谢谢!