派生实例Eq(Sink p)

时间:2012-11-12 19:54:02

标签: haskell

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

2 个答案:

答案 0 :(得分:5)

是的,这将有效,因为有一个实例Eq (MVar a)可以测试MVar是否相同[1]。 Sink的派生实例将使用它。但是,这可能不是您想要的,因为Eq实例不会比较MVar的内容,只是它们在内存中是否相同MVar

您问题的答案

  

但是如何从类似的东西创建一个实例?我只是使用   派生和ghc会弄明白吗?

可能是“不,你必须编写一个具有你想要的属性的实例。”

答案 1 :(得分:4)

对于Bool,实例实际上是

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

当然。

有关如何在一般情况下推导实例的说明,请参阅Chapter 10 of the Haskell Report

对于您的示例类型,一个等效于派生的实例声明是 - 直截了当 -

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

因此,由于websocket接收器的类型与可变变量类型的某个实例同构,因此比较两个接收器会减少两个比较两个可变变量。