Haskell入门篇七:类型类

Posted Lambda小粽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell入门篇七:类型类相关的知识,希望对你有一定的参考价值。

今天带给大家的文章是有关Haskell中的类型类的介绍。通过之前的文章相信大家对Haskell中的类型系统已经有了较为清晰的认知。今天的内容就是以此为基础的,如果没有看过之前类型篇的朋友建议先进行阅读,方便今天内容的理解。 


相信大家之前一定看过类似形式的函数类型。在Haskell中我们一般用这样的方法来表明, 在函数定义中,函数的类型中的某个类型a被约束(或者书被归类于)某个类型类之中。

Haskell入门篇七:类型类


所以我们应该如何理解Haskell中的类型类呢?需要注意的是,虽然名称中有『类』(type class),但是其实类型类和我们在OOP(面向对象编程)中所说的class的概念并不尽相似。在这里我们为了方便理解,可以将其想象成Java等语言中的interface(接口)。每一个类型类中都定义了很多关于这个类型类的函数。而当一个类型的变量被归属于这个类型类的时候,程序员需要编写这些函数的具体实现。这就类似于在Java中定义一个接口,接口中的函数全部都是抽象的,而当我们创建了一个类需要实现这个接口的时候,我们就必须要实现接口中的函数。

那么定义类型类的用途又是什么呢?就如在Java中我们定义接口的原因一样,比如我们想要定义一个函数去判断两个变量是否相等,如果没有类型类的帮助,我们需要对每一个类型都定义一个函数进行判断。(这里需要注意的是,我们不需要判断类型是否相同,因为在定义函数的时候我们的类型应为 a -> a -> Bool 意味着前两个变量的类型一定是相同的)。现在有了类型类的帮助,我们只需要定义一个类型类并在类型类中定义判断相等的函数,然后对于每一个想要使用这个函数的类型,只要让类型实现这个类型类就可以了。(具体如何定义类型类和如何让类型实现类型类中的函数我们会在后面的文章提到。)事实上Haskell中已经内置定义了这个类型类 — Eq 

Haskell入门篇七:类型类


如我们所见,Eq类型类中定义了两个operator(之前有提到过operator其实就 是函数),下面一行的意思是这两个函数至少有一个在类型实现类型类的时候必须被实现,因为在源代码中我们发现这两个函数是可以互相定义的,所以只要实现了其中 一个就可以实现另一个。在函数的使用时,我们需要让我们的函数类型处于Eq类型类的约束之内。

Haskell入门篇七:类型类


接下来我们来尝试着定义函数来体会Eq类型类的作用。我们来定义这么一个函数, 对于一个单个element和一个和这个element相同类型的元素组成的list,我们将list中与element相同的元素全部删除。

Haskell入门篇七:类型类


Haskell入门篇七:类型类


运行的结果如上图所示,这个函数可以应用于很多类型的input上。由于charint类型都deriveEq类型类,所以在作『x==y』这一步时,我们只需要让函数的类型被Eq类型类约束就好。(Haskell中的string其实就是[char]这个类型)。值得注意的是,如果没有引入类型类约束而又使用了类型类中的函数,那么Haskell编译器就会报错,错误内容如下所示。


Haskell中还有很多非常常见的类型类,比如有序类型类Ord,枚举类型类Enum,数字类型类Num还有显示类型类Show,感兴趣的朋友可以用:i去自行查看他们所包含的函数,在这里我就不一一列举了。这节课关于类型类的介绍,我们都一起学到了么。

接下来的文章我会给大家带来有关高阶函数的介绍,敬请期待。



注:本文为原创内容,转载请标明出处。



以上是关于Haskell入门篇七:类型类的主要内容,如果未能解决你的问题,请参考以下文章

haskell简明入门

Haskell:类型类问题

为啥 Haskell 没有在函数签名中推断数据类型的类型类?

Haskell 多态性和类型类实例

Haskell概率单子的类型类问题

Haskell 的类型类和 Go 的接口