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)
PS我读过这篇文章,但它超出了我的理解能力 http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/deriving.html
答案 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接收器的类型与可变变量类型的某个实例同构,因此比较两个接收器会减少两个比较两个可变变量。