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

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

你的问题的答案

但是我如何从类似的东西创建一个实例......我只是使用派生并且 ghc 会自己解决吗?

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

于 2012-11-12T20:13:18.400 回答
4

对于Bool实例实际读取

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

当然。

有关在一般情况下派生实例如何工作的描述,请参阅Haskell 报告的第 10 章

对于您的示例类型,与派生内容等效的实例声明是——直截了当——</p>

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

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

于 2012-11-12T20:22:02.263 回答