Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 导出实例Eq(Sink p)_Haskell - Fatal编程技术网

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你说得对。此外,生成的实例将不包含约束。我已经编辑了我的答案。