是否可以将两个GObject与haskell gi进行比较,并找出它们是否';你是一样的吗?
使用Gtk2Hs,我曾经能够将gtk对象与是否可以将两个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
==
进行比较,以确定它们是否相同。例如:
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'
或者类似的。哦,太好了!谢谢!