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 定义实例与使用类约束_Haskell - Fatal编程技术网

Haskell 定义实例与使用类约束

Haskell 定义实例与使用类约束,haskell,Haskell,我正在经历 我在讨论类型类的章节。下面是一段: class (Eq a) => Num a where 我认为这是对Num类施加的一个类约束,迫使它充当一个可平等的类。我的问题是,为什么没有将Num实现为Eq的一个实例?像这样: instance Eq Num where ... stuff 定义一个实例似乎是一种更简洁的方法,但也许我遗漏了一些东西。有人能给我解释一下区别吗?让我们用英语发几个Haskell声明;也许这会澄清一些事情。我将首先给出Haskell声明,然后给出一个英文音

我正在经历

我在讨论类型类的章节。下面是一段:

class (Eq a) => Num a where
我认为这是对
Num
类施加的一个类约束,迫使它充当一个可平等的类。我的问题是,为什么没有将
Num
实现为
Eq
的一个实例?像这样:

instance Eq Num where
... stuff

定义一个实例似乎是一种更简洁的方法,但也许我遗漏了一些东西。有人能给我解释一下区别吗?

让我们用英语发几个Haskell声明;也许这会澄清一些事情。我将首先给出Haskell声明,然后给出一个英文音译

class Eq a where (==) :: a -> a -> Bool
有一套类型。我们将此集合命名为
Eq
。如果
a
是此集合中的一种类型,那么我们可以使用名为
(==)
的函数比较该类型的两个值是否相等

有一种类型名为
Brillant
。它有构造函数
T
F
FileNotFound
Brillant
类型是
Eq
集合的一个元素。通过检查它们是否使用相同的构造函数,可以比较Brillant类型的两个项是否相等

data Maybe a = Nothing | Just a
instance Eq a => Eq (Maybe a) where
    Nothing == Nothing = True
    Just v == Just v' = v == v'
每当我们有一个类型
a
,就会有另一个类型
可能是a
。如果
a
Eq
集合的元素,那么
可能a
Eq
集合的元素

class Eq a => Num a where
    (+) :: a -> a -> a
有一套类型。我们将此集合命名为
Num
。如果
a
是此集合中的一种类型,则
a
也在集合
Eq
(或者换句话说,
Num
Eq
的子集)。如果
a
Num
集合中的一个类型,那么我们可以添加两个该类型的值,并使用
(+)
函数获得第三个值

如果以下声明有效,Haskell的意思如下:

instance Eq Num where -- ...
名为
Num
的类型集是名为
Eq
的类型集的元素

现在让我们比较最后两个,即,
类Eq a=>numa
实例Eq Num
。前者说
Num
集合的成员也是
Eq
集合的成员,而后者说
Num
集合本身是
Eq
集合的成员。希望后者能在你的头脑中敲响警钟。因为我们说过,
Eq
是一组类型,所以该组的所有成员都应该是类型。但是我们也说过,
Num
是一组类型,而不是一个类型;所以它不能成为会员


谈论类型集是有意义的,也就是说,其实例是其他类的类,但是
Eq
Num
都不这样做。因此,声称
Num
Eq

的一个实例是不正确的,让我们用英语来发几个Haskell声明;也许这会澄清一些事情。我将首先给出Haskell声明,然后给出一个英文音译

class Eq a where (==) :: a -> a -> Bool
有一套类型。我们将此集合命名为
Eq
。如果
a
是此集合中的一种类型,那么我们可以使用名为
(==)
的函数比较该类型的两个值是否相等

有一种类型名为
Brillant
。它有构造函数
T
F
FileNotFound
Brillant
类型是
Eq
集合的一个元素。通过检查它们是否使用相同的构造函数,可以比较Brillant类型的两个项是否相等

data Maybe a = Nothing | Just a
instance Eq a => Eq (Maybe a) where
    Nothing == Nothing = True
    Just v == Just v' = v == v'
每当我们有一个类型
a
,就会有另一个类型
可能是a
。如果
a
Eq
集合的元素,那么
可能a
Eq
集合的元素

class Eq a => Num a where
    (+) :: a -> a -> a
有一套类型。我们将此集合命名为
Num
。如果
a
是此集合中的一种类型,则
a
也在集合
Eq
(或者换句话说,
Num
Eq
的子集)。如果
a
Num
集合中的一个类型,那么我们可以添加两个该类型的值,并使用
(+)
函数获得第三个值

如果以下声明有效,Haskell的意思如下:

instance Eq Num where -- ...
名为
Num
的类型集是名为
Eq
的类型集的元素

现在让我们比较最后两个,即,
类Eq a=>numa
实例Eq Num
。前者说
Num
集合的成员也是
Eq
集合的成员,而后者说
Num
集合本身是
Eq
集合的成员。希望后者能在你的头脑中敲响警钟。因为我们说过,
Eq
是一组类型,所以该组的所有成员都应该是类型。但是我们也说过,
Num
是一组类型,而不是一个类型;所以它不能成为会员


谈论类型集是有意义的,也就是说,其实例是其他类的类,但是
Eq
Num
都不这样做。因此,声称
Num
Eq

的一个实例是不正确的,我认为您在类型和类型类之间混淆了。只能将一个类型而不是另一个类型类作为类型类的实例
实例Eq Num,其中…
是无效语法。@Jubobs不是
Num
在本例中是扩展
Eq
的类型。摘自LYAH:您还可以创建作为其他TypeClass子类的TypeClass。Num的类声明有点长,但这里是第一部分:
class(Eq a)=>Num a,其中
Num
是一个类型类(Eq的子类),而不是一个类型。@dopatraman即席多态性提供重载。您可以在不同类型(您为其提供了实例)上使用相同的函数。如
+
函数可在中的
上使用