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
附言:我读过这篇文章,但它超出了我理解http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/deriving.html的能力范围
发布于 2012-11-13 04:13:18
是的,这将会起作用,因为有一个实例Eq (MVar a)可以测试MVar是否与[1]相同。Sink的派生实例将使用该实例。但是,这可能不是您想要的结果,因为Eq实例不会比较MVar的内容,而只是比较它们在内存中是否相同的MVar。
你问题的答案
但是我如何从像这样的东西创建一个实例...我是否只需要使用派生,ghc就会自己找出答案?
可能是“不,您必须编写一个具有所需属性的实例”。
发布于 2012-11-13 04:22:02
对于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接收器的类型与可变变量类型的某个实例化同构,因此比较两个接收器可以减少两个比较两个可变变量。
https://stackoverflow.com/questions/13350569
复制相似问题