返回文章列表

文章

Get Programming with Haskell-13

你将学习 Haskell 类型系统中的一个重要抽象——类型类(Type classes)。类型类允许你根据共享的行为对类型进行分组。乍一看,类型类类似于大多数面向对象编程语言中的接口。类型类声明了一个类型必须支持哪些函数,就像接口规定了一个类必须支持哪些方法一样。但类型类在 Haskell 中扮演的角色,比在 Java 或 C# 等语言中的接口更为重要。主要的区别是,当你深入学习 Haskell 时,你会发现类型类通常要求你以越来越强大的抽象形式进行思考。在许多方面,类型类是 Haskell 编程的核心。

# 类型类 ## 1. 进一步探索类型 到目前为止,你已经看到了一些类型签名,甚至自己构建了一些非平凡的类型。学习各种 Haskell 类型的最佳方式之一是使用 GHCi 中的 `:t`(或更详细的 `:type`)命令来检查你在实际编程中遇到的函数类型。当你第一次编写 `simple` 函数时,你是没有类型签名的: `simple x = x` 如果你想知道函数类型是什么,可以在GHCi中使用`:t` ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/67f45db0-8e70-47d8-82b4-856e2da2cd26/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466ZRIE3BSG%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T180926Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJGMEQCIC7kBvmOJoayJxpbIjhiy8pwN86NGK5VlFJgW35Wj5FQAiAnGcuxxE6%2B4tS%2B38VHT3CH2TrHkPEKHm28XejMX7VRXSr%2FAwg6EAAaDDYzNzQyMzE4MzgwNSIML8WviV%2FZgrVieR2gKtwDhE2vEae7CUCX9DzttQynWe2lx3WYnVXxquYwYZlZmUcAGYYsqO59l7Yphq49c3ulpVTDN1HsRgNowzQ1qA8NqSLXDHhGNWJFUsCueRJm%2B2gJBFnt%2F3sdOvjNyKrWxIJdN1%2Fa6tydkIWSvFtfIB0CUhB4Hi1wZx%2BqlMmw5PZ3rh%2B7UutK3E%2FDRkvVidaUFmNmcwlBgMu9AuApc8WMd5LGA2vmumh7btp8VA2TWsPG97wGaLsAiAE049vS7q%2BQjtrxP9aYzyYKP%2B%2ByOAq5fGUr1dLh0yn2OseHg83Yqxq7GxbMGnF9Qf1dyzlGZEifoMb%2Bj%2BEUjO6vV5Fj7V406PHVd6VzEXvIZprEYcA5B%2FsF5O0DnNt29zCjAzImGU5A%2BLh1xpHXbbGTbzfIbxPEG3xPynfGP6B%2BMFBeQROolS5ZlM90pDVprUrxucp05vD%2BuUss%2F4yn3dQ6JYEMD1cLt1Bsgx9eObM96ABtkNZDPz2YTI%2FIw1rkfpwWKf2KFpC%2F8cOgV%2F%2FyQJ%2Fc2adx22zquJij8KLZtxgD43XPQPwIDWtEeBp4UPBfl6xDrRW169DGfuGg1Do%2FhyK0mtaI%2BwqMiIAsWei1vvYd9OlTE53NCyQ6xHkArhv4bHTEYuIUc5cw%2Fc7B1AY6pgFMJNZwjcyEtaItZbzijgfDDInrPI3hTsumxSpOB6CTahANGZ%2Bnsc%2FusvSk%2BvewebUdHSM46kzkMhFg8ONigI4tWdW1KuzONWqhUlk%2BzUlYIO7VP9TZlmu1x%2FhcnVfX0e%2BLg50j2NQvwjI%2Fe7ywdTj%2Bbx%2F2MB%2BjsikZR4jzGceHPUzQRrzlOsozqg%2BjoczWFcoMhL1BLpKrL0Iu4J%2BD1Wuzk8NNbBKs&X-Amz-Signature=a85305d22b804c5250ae89ee7a2182682775c7055d2a3ff07725c9fb8e213766&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 你也可以对lambda版本的simple做同样的事情: ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/1fe38288-4379-4b68-abd7-cd624f845901/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466ZRIE3BSG%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T180926Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJGMEQCIC7kBvmOJoayJxpbIjhiy8pwN86NGK5VlFJgW35Wj5FQAiAnGcuxxE6%2B4tS%2B38VHT3CH2TrHkPEKHm28XejMX7VRXSr%2FAwg6EAAaDDYzNzQyMzE4MzgwNSIML8WviV%2FZgrVieR2gKtwDhE2vEae7CUCX9DzttQynWe2lx3WYnVXxquYwYZlZmUcAGYYsqO59l7Yphq49c3ulpVTDN1HsRgNowzQ1qA8NqSLXDHhGNWJFUsCueRJm%2B2gJBFnt%2F3sdOvjNyKrWxIJdN1%2Fa6tydkIWSvFtfIB0CUhB4Hi1wZx%2BqlMmw5PZ3rh%2B7UutK3E%2FDRkvVidaUFmNmcwlBgMu9AuApc8WMd5LGA2vmumh7btp8VA2TWsPG97wGaLsAiAE049vS7q%2BQjtrxP9aYzyYKP%2B%2ByOAq5fGUr1dLh0yn2OseHg83Yqxq7GxbMGnF9Qf1dyzlGZEifoMb%2Bj%2BEUjO6vV5Fj7V406PHVd6VzEXvIZprEYcA5B%2FsF5O0DnNt29zCjAzImGU5A%2BLh1xpHXbbGTbzfIbxPEG3xPynfGP6B%2BMFBeQROolS5ZlM90pDVprUrxucp05vD%2BuUss%2F4yn3dQ6JYEMD1cLt1Bsgx9eObM96ABtkNZDPz2YTI%2FIw1rkfpwWKf2KFpC%2F8cOgV%2F%2FyQJ%2Fc2adx22zquJij8KLZtxgD43XPQPwIDWtEeBp4UPBfl6xDrRW169DGfuGg1Do%2FhyK0mtaI%2BwqMiIAsWei1vvYd9OlTE53NCyQ6xHkArhv4bHTEYuIUc5cw%2Fc7B1AY6pgFMJNZwjcyEtaItZbzijgfDDInrPI3hTsumxSpOB6CTahANGZ%2Bnsc%2FusvSk%2BvewebUdHSM46kzkMhFg8ONigI4tWdW1KuzONWqhUlk%2BzUlYIO7VP9TZlmu1x%2FhcnVfX0e%2BLg50j2NQvwjI%2Fe7ywdTj%2Bbx%2F2MB%2BjsikZR4jzGceHPUzQRrzlOsozqg%2BjoczWFcoMhL1BLpKrL0Iu4J%2BD1Wuzk8NNbBKs&X-Amz-Signature=20ad028d71a4fac2f8858a57754081b5c9ca39f4a88aad2ed04ad86e35edd599&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 如果你以这种方式开始探索类型,你将几乎立刻遇到一些你还没见过的内容。以加法为例: ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/7dcdaf24-98d6-4300-a12a-646e70d6c4fe/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466ZRIE3BSG%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T180926Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJGMEQCIC7kBvmOJoayJxpbIjhiy8pwN86NGK5VlFJgW35Wj5FQAiAnGcuxxE6%2B4tS%2B38VHT3CH2TrHkPEKHm28XejMX7VRXSr%2FAwg6EAAaDDYzNzQyMzE4MzgwNSIML8WviV%2FZgrVieR2gKtwDhE2vEae7CUCX9DzttQynWe2lx3WYnVXxquYwYZlZmUcAGYYsqO59l7Yphq49c3ulpVTDN1HsRgNowzQ1qA8NqSLXDHhGNWJFUsCueRJm%2B2gJBFnt%2F3sdOvjNyKrWxIJdN1%2Fa6tydkIWSvFtfIB0CUhB4Hi1wZx%2BqlMmw5PZ3rh%2B7UutK3E%2FDRkvVidaUFmNmcwlBgMu9AuApc8WMd5LGA2vmumh7btp8VA2TWsPG97wGaLsAiAE049vS7q%2BQjtrxP9aYzyYKP%2B%2ByOAq5fGUr1dLh0yn2OseHg83Yqxq7GxbMGnF9Qf1dyzlGZEifoMb%2Bj%2BEUjO6vV5Fj7V406PHVd6VzEXvIZprEYcA5B%2FsF5O0DnNt29zCjAzImGU5A%2BLh1xpHXbbGTbzfIbxPEG3xPynfGP6B%2BMFBeQROolS5ZlM90pDVprUrxucp05vD%2BuUss%2F4yn3dQ6JYEMD1cLt1Bsgx9eObM96ABtkNZDPz2YTI%2FIw1rkfpwWKf2KFpC%2F8cOgV%2F%2FyQJ%2Fc2adx22zquJij8KLZtxgD43XPQPwIDWtEeBp4UPBfl6xDrRW169DGfuGg1Do%2FhyK0mtaI%2BwqMiIAsWei1vvYd9OlTE53NCyQ6xHkArhv4bHTEYuIUc5cw%2Fc7B1AY6pgFMJNZwjcyEtaItZbzijgfDDInrPI3hTsumxSpOB6CTahANGZ%2Bnsc%2FusvSk%2BvewebUdHSM46kzkMhFg8ONigI4tWdW1KuzONWqhUlk%2BzUlYIO7VP9TZlmu1x%2FhcnVfX0e%2BLg50j2NQvwjI%2Fe7ywdTj%2Bbx%2F2MB%2BjsikZR4jzGceHPUzQRrzlOsozqg%2BjoczWFcoMhL1BLpKrL0Iu4J%2BD1Wuzk8NNbBKs&X-Amz-Signature=e2c36aea98a0f367fae53ac1921156d9b6eaa12dabf16d1b3dc37fef58dc7f5d&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 尽管你已经花了这么多时间在类型上,像加法这样简单的操作仍然让你感到困惑!其中最大的谜团就是 `Num a =>` 这一部分。