使用Gtk2Hs,我曾经能够将gtk对象与==
进行比较,以确定它们是否相同。例如:
boxIsFromState :: VBox -> State -> Bool
boxIsFromState widget state = _widget state == widget
其中State
是自定义数据类型容器的另一个VBox。
我注意到haskell-gi
的小部件并非来自Eq
。还有另一种比较对象的方法吗?
答案 0 :(得分:3)
免责声明:虽然我是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'
或类似的。