派生实例Eq(Sink p)

Ger*_*ens 0 haskell

class  Eq a  where
    (==), (/=)           :: a -> a -> Bool
    x /= y               = not (x == y)
    x == y               = not (x /= y)

deriving instance Eq Bool
Run Code Online (Sandbox Code Playgroud)

我认为它会产生

instance Eq Bool where
    True == True = True
    False == False = True
Run Code Online (Sandbox Code Playgroud)

但是如何从类似的东西创建一个实例

newtype Sink p = Sink {unSink :: MVar (E.Iteratee (Message p) IO ())}

instance Eq (Sink p) where
 ?==? = True
Run Code Online (Sandbox Code Playgroud)

我只是使用派生而ghc会弄清楚自己吗?

deriving instance Eq (Sink p)
Run Code Online (Sandbox Code Playgroud)

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

opq*_*nut 5

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

你的问题的答案

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

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

  • @GertCuykens你做了一些IO.但首先你坐下来弄清楚如果他们两个都没有_have_内容会发生什么. (2认同)