Haskell 导出实例Eq(Sink p)
我想它会产生Haskell 导出实例Eq(Sink p),haskell,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 Fa
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
我是否只使用派生,ghc就会自己解决问题
newtype Sink p = Sink {unSink :: MVar (E.Iteratee (Message p) IO ())}
instance Eq (Sink p) where
?==? = True
PS我读过这篇文章,但它超出了我的理解能力
是的,这将起作用,因为有一个实例
Eq(MVar a)
测试是否MVar
s是相同的[]。Sink
的派生实例将使用它。但是,这可能不是您想要的,因为Eq
实例不比较MVar
的内容,只比较它们在内存中是否相同
你问题的答案是什么
但是我如何从以下内容创建实例。。。我只是使用
推导和ghc将自行解决
newtype Sink p = Sink {unSink :: MVar (E.Iteratee (Message p) IO ())}
instance Eq (Sink p) where
?==? = True
可能是“否,您必须编写一个具有所需属性的实例。”对于
Bool
实例实际读取
deriving instance Eq (Sink p)
当然
有关派生实例在一般情况下如何工作的说明,请参见
对于您的示例类型,直接使用与将要派生的内容等效的实例声明-
True == True = True
False == False = True
_ == _ = False
因此,由于websocket接收器的类型同构于可变变量类型的某个实例化,比较两个接收器减少了比较两个可变变量的两个实例。不,我无法想象它会起作用:)在测试
newtype Sink p=Sink{unSink::MVar(E.Iteratee(Message p)IO())}派生(Eq)
之所以有效,是因为每个套接字都有不同的MVar@GertCuykens你做了些事情。但首先你要坐下来,想一想如果它们实际上都没有内容,会发生什么。在这种情况下,你甚至不需要Eq p
约束。@DanielWagner你说得对。此外,生成的实例将不包含约束。我已经编辑了我的答案。