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_Haskell_Instance_Typeclass - Fatal编程技术网

Haskell 如何在没有派生的情况下引用Eq

Haskell 如何在没有派生的情况下引用Eq,haskell,instance,typeclass,Haskell,Instance,Typeclass,对不起,我的英语很差。标题可能无法解释我的意思 在Data.Tree中,树定义如下: -- | Multi-way trees, also known as /rose trees/. data Tree a = Node { rootLabel :: a, -- ^ label value subForest :: Forest a -- ^ zero or more child trees } #ifdef __GLASGOW_HA

对不起,我的英语很差。标题可能无法解释我的意思

在Data.Tree中,
定义如下:

-- | Multi-way trees, also known as /rose trees/.
data Tree a = Node {
        rootLabel :: a,         -- ^ label value
        subForest :: Forest a   -- ^ zero or more child trees
    }
#ifdef __GLASGOW_HASKELL__
  deriving (Eq, Read, Show, Data)
#else
  deriving (Eq, Read, Show)
#endif
它使用
派生
来实例
=
/=
用于
(日期)

我能做同样的事情而不去推导吗? 我尝试过这样的事情:

data Test a = Test a
instance Eq Test where
    (Test a) == (Test b) = a == b
但它抛出了一个例外。我认为原因在于a和b的类型

如果我想用
==
为我的数据定义自定义操作,我该怎么办


我知道我可以用
Functor
fmap
来做这件事。但是我想使用
=
a==b
其中
a=test1
b=Test“a”
。有可能吗?

您可以在
测试
上定义
Eq的
实例
,但您的定义存在一些问题

instance Eq Test where
    (Test a) == (Test b) = a == b
第一个是
Eq测试中的
Test
仍然是参数化的。实际上,您编写了
数据测试a=…
,这意味着存在一个类型参数。因此,您可以通过以下方式指定:

instance Eq (Test a) where
    (Test y) == (Test x) = x == y
现在,如果
a
也是
Eq
的实例,则指定
testa
Eq
的实例

对于
数据结构,
Eq
实例
应该如下所示:

instance (Eq a, Eq (Forest a)) => Eq (Tree a) where
    (Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2
(当然,我在这里定义了两棵树是如何相等的,您可能希望以(语义上)不同的方式定义两棵树上的相等,因此您本身不应该复制粘贴此代码)

请注意,就像所说的那样,如果
类型林a=[treeA]
,那么您可以省略
Eq(林a)
类型约束,因为
实例Eq a=>Eq[a]
保持不变。因此,在这种情况下:

instance Eq a => Eq (Tree a) where
    (Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2

注意:
林a
[a]
的类型同义词,因此从技术上讲,
Eq(林a)
约束是不必要的,因为
Eq a
已经暗示了
Eq[a]
。但考虑到问题的参数,这个答案很清楚。@luqui:你说得对。我不知道森林被定义为
[treea]
(可能添加了一些额外的字段)。我在答案中加上了你的注释和一些评论。谢谢最后两个实例在
Eq(树a)
中缺少
Eq
。感谢@chi发现这一点。固定的。
instance Eq a => Eq (Tree a) where
    (Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2