haskell - 是否可以使用 haskell-gi 比较两个 gobject 并找出它们是否相同?

标签 haskell gtk3

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

或类似的替代品。

关于haskell - 是否可以使用 haskell-gi 比较两个 gobject 并找出它们是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164600/

相关文章:

haskell - 如何获得调用错误的位置?

haskell - 记录没有无限类型错误

linux - 在 Vala & Gtk3 中制作透明窗口的简单方法?

python - 如何构建使用 GUI 的程序?

haskell - 索引向量中类型参数的顺序

haskell - 对 "ghci"和 "stack ghci"使用不同的配置

haskell - 使用 Hspec 单元测试 IO 操作

python - 将 Gtk.Widget 放入带有顶部填充的 Box 中

python-3.x - gtk3 框架标签位置 3.18 与 3.22

Windows 上的 Python3 和 GTK3