2017-05-24 5 views
1

Gtk2Hsではgtkオブジェクトを==と比較して、それらが同じかどうかを調べることができました。例:2つのオブジェクトをhaskell-giと比較して、それらが同じかどうか調べることは可能ですか?

ここで、Stateは、別のVBoxのデータ型コンテナです。

私は気づいたhaskell-giのウィジェットはEqから派生していません。オブジェクトを比較する別の方法はありますか?

答えて

2

免責事項:私は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' 

または類似を書きたいかもしれません、その場合、あなたの平等のテストの目的のために所有権を無視するということが可能です。

+0

これは素晴らしいです!どうもありがとう! – Arthur

関連する問題