2012-11-12 30 views
0
class Eq a where 
    (==), (/=)   :: a -> a -> Bool 
    x /= y    = not (x == y) 
    x == y    = not (x /= y) 

deriving instance Eq Bool 

我認爲它會產生獲得實例式(沉P)

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

+0

你試過了嗎? – huon

+0

不,我無法想象它會工作:) –

+0

測試'newtype Sink p = Sink {unSink :: MVar(E.Iteratee(Message p)IO())}派生(Eq)'工作,因爲每個套接字都有一個不同的MVar –

回答

5

是的,這會起作用,因爲有一個實例Eq (MVar a),測試S是否要MVar是相同[1]。 Sink的派生實例將使用該實例。但是,這可能不是您想要的,因爲Eq實例不會比較MVar的內容,只是它們在內存中是否相同MVar

的回答你的問題

但我怎麼從東西創建一個實例一樣......難道我只是用 推導和GHC會找出自己?

可能是「不,您必須編寫一個具有所需屬性的實例。」

+0

Thx你是對的,我如何比較它的內容? –

+2

@GertCuykens你做一些IO。但是,首先你坐下來弄清楚如果他們實際上都沒有什麼內容會發生什麼。 –

4

對於Bool實例實際讀取

True == True = True 
False == False = True 
_  == _  = False 
當然

有關在一般情況下派生實例如何工作的說明,請參閱Chapter 10 of the Haskell Report

對於示例類型,實例聲明等效於將得出的是,straightforwardly-

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

因此,如WebSocket的水槽的類型是同構於可變變量的類型有一定的實例,比較兩個匯點減少了兩個比較兩個可變變量。

+2

在這種情況下,你甚至不需要'Eq p'約束。 –

+0

@DanielWagner你是對的。而且,生成的實例不包含約束。我編輯了我的答案。 –