2017-05-24 28 views

回答

2

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

或类似的,而不是所有权。

+0

哦,太棒了!非常感谢! – Arthur

相关问题