0
class  Eq a  where
    (==), (/=)           :: a -> a -> Bool
    x /= y               = not (x == y)
    x == y               = not (x /= y)

deriving instance Eq Bool

私はそれが生成すると仮定します

instance Eq Bool where
    True == True = True
    False == False = True

しかし、次のようなものからインスタンスを作成するにはどうすればよいですか

newtype Sink p = Sink {unSink :: MVar (E.Iteratee (Message p) IO ())}

instance Eq (Sink p) where
 ?==? = True

派生を使用するだけで、ghc はそれ自体を把握しますか?

deriving instance Eq (Sink p)

http://hackage.haskell.org/packages/archive/websockets/0.7.0.0/doc/html/src/Network-WebSockets-Monad.html#Sink

PS私はこれを読みましたが、理解する私の能力を超えています http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/deriving.html

4

2 に答える 2

5

はい、 toが同じEq (MVar a)かどうかをテストするインスタンスがあるため、これは機能します [ 1 ]。の派生インスタンスはそれを使用します。ただし、インスタンスは s の内容を比較せず、メモリ内で同じかどうかのみを比較するため、これは望ましくない場合があります。MVarSinkEqMVarMVar

あなたの質問への答え

しかし、次のようなものからインスタンスを作成するにはどうすればよいですか...派生を使用するだけで、ghcはそれ自体を理解しますか?

おそらく「いいえ、必要なプロパティを持つインスタンスを作成する必要があります」です。

于 2012-11-12T20:13:18.400 に答える
4

Boolインスタンスが実際に読み取る

True  == True  = True
False == False = True
_     == _     = False

もちろん。

インスタンスの導出が一般的なケースでどのように機能するかについては、Haskell Report の第 10 章を参照してください。

あなたの例の型の場合、派生するものと同等のインスタンス宣言は—単純です—</p>

instance Eq (Sink p) where
  Sink var == Sink var' = var == var'

したがって、websocket シンクの型は、可変変数の型の特定のインスタンス化と同形であるため、2 つのシンクを比較すると、2 つの可変変数を比較する 2 が削減されます。

于 2012-11-12T20:22:02.263 に答える