首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导出实例Eq (Sink p)

导出实例Eq (Sink p)
EN

Stack Overflow用户
提问于 2012-11-13 03:54:02
回答 2查看 237关注 0票数 0
代码语言:javascript
复制
class  Eq a  where
    (==), (/=)           :: a -> a -> Bool
    x /= y               = not (x == y)
    x == y               = not (x /= y)

deriving instance Eq Bool

我假设它会生成

代码语言:javascript
复制
instance Eq Bool where
    True == True = True
    False == False = True

但是如何从下面这样的内容创建实例呢?

代码语言:javascript
复制
newtype Sink p = Sink {unSink :: MVar (E.Iteratee (Message p) IO ())}

instance Eq (Sink p) where
 ?==? = True

我是否只需要使用派生,ghc就会自己找出答案?

代码语言:javascript
复制
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的能力范围

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-13 04:13:18

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

你问题的答案

但是我如何从像这样的东西创建一个实例...我是否只需要使用派生,ghc就会自己找出答案?

可能是“不,您必须编写一个具有所需属性的实例”。

票数 5
EN

Stack Overflow用户

发布于 2012-11-13 04:22:02

对于Bool,实例实际读取

代码语言:javascript
复制
True  == True  = True
False == False = True
_     == _     = False

当然了。

有关派生实例在一般情况下的工作原理的说明,请参阅Chapter 10 of the Haskell Report

对于您的示例类型,与将派生的实例声明等效的实例声明是-直接-

代码语言:javascript
复制
instance Eq (Sink p) where
  Sink var == Sink var' = var == var'

因此,由于websocket接收器的类型与可变变量类型的某个实例化同构,因此比较两个接收器可以减少两个比较两个可变变量。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13350569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档