返回文章列表

文章

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=ASIAZI2LB4667TVL4YIG%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T223757Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDHqipfgRcwp9dXm2j0J%2B9%2BiIAmwHvhu2SeAlIJmV9gwQIgHg5SyJjq%2F3IhHJTEZC1hX5ClS7cO3NchcJ2w3ve8FFgqiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDM1WlSMdoneC9p3vhyrcA4P3BJInRYSeTylMm2mRQTET%2Fbp1zfK31AFSgi%2BEK40C18xX5blQcX9QfsjkiXR2jeGqa8Ig3qEu6zhHhXlWjQx0U4lKqNYQRkT%2BV%2BMhhf2R8paqfgVzh8nBk5ZorMnd5OCrIrjBCy5Dy9yoSsTY1ijrSMK3Dcy8thyoyrIfm%2BKO3NMFZ5hEbKbYfnCfoFzdh%2FcngeNoc1I08aUxQ4tAHbPz61bLmK78WCpF6FhX7%2FcoW7yoiBLE5wFU6SB%2B7ycg57i%2B75yR7dr7Tvv8vbZ2GnUMjhHap6P8ZVChOEQuuzHjiUsy0T9EgsXfOAG%2Fbx60j3Xn0n89Q5u5O53kmSLVUb0R79VPc2SFXT%2FSdh4cPORfXbS9meQRr64KAnWxsXkzKnBz8xmI6r0i3ZILBEuVetmZ5fmXAmeFjdYmmCzYaAxz%2FpYJdRRBn0xvKBO%2BBwdMbPrrcpP4ntVYeSidaE4ocf6gCx4QsYLNs2fzfGZEyINxC4T8AhcekhalZtbz3%2B3zj4tiKQhU46GonaqKWI68CguLGRrorXCG%2BRN6vT9JgM%2Flm0YBaTRZy9T1wIQcVWiUc0EEItbS7MylmGrPDgMjhi%2B0VacXXB2wG5XU3682NMXhTkwkSkrM9N2RljEZMM67ytYGOqUB3Qz8FPQGMMPvFL4wgBn82%2BUBFe2W4yV4SdLd9Wcb5cYwsu9NzyAGWOqi6spbqk%2FfweFcILKlLgcYZ8FcEkVT5LU0rI9YqdaFKRzJpeuknb1R94M2%2FZW6vtZz3PtICkDpTy0WvgneUIWJOm4fnhOPgdIJ9NF3Dh7tZyYODn0wV6uquf3Z1RhQoSvNYHvRLxdNOzt5a%2BFqBBmRDx5s5chn2vEdOIgH&X-Amz-Signature=89896b1062cae1a544f1b77b9ed6c478c63cbabe1bf165d7282d14b7165da73d&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1da5c571-bb7d-808c-9042-d313c96baf30.4b1b167f-4b52-4031-8233-f4f2689af574) 你也可以对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=ASIAZI2LB4667TVL4YIG%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T223757Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDHqipfgRcwp9dXm2j0J%2B9%2BiIAmwHvhu2SeAlIJmV9gwQIgHg5SyJjq%2F3IhHJTEZC1hX5ClS7cO3NchcJ2w3ve8FFgqiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDM1WlSMdoneC9p3vhyrcA4P3BJInRYSeTylMm2mRQTET%2Fbp1zfK31AFSgi%2BEK40C18xX5blQcX9QfsjkiXR2jeGqa8Ig3qEu6zhHhXlWjQx0U4lKqNYQRkT%2BV%2BMhhf2R8paqfgVzh8nBk5ZorMnd5OCrIrjBCy5Dy9yoSsTY1ijrSMK3Dcy8thyoyrIfm%2BKO3NMFZ5hEbKbYfnCfoFzdh%2FcngeNoc1I08aUxQ4tAHbPz61bLmK78WCpF6FhX7%2FcoW7yoiBLE5wFU6SB%2B7ycg57i%2B75yR7dr7Tvv8vbZ2GnUMjhHap6P8ZVChOEQuuzHjiUsy0T9EgsXfOAG%2Fbx60j3Xn0n89Q5u5O53kmSLVUb0R79VPc2SFXT%2FSdh4cPORfXbS9meQRr64KAnWxsXkzKnBz8xmI6r0i3ZILBEuVetmZ5fmXAmeFjdYmmCzYaAxz%2FpYJdRRBn0xvKBO%2BBwdMbPrrcpP4ntVYeSidaE4ocf6gCx4QsYLNs2fzfGZEyINxC4T8AhcekhalZtbz3%2B3zj4tiKQhU46GonaqKWI68CguLGRrorXCG%2BRN6vT9JgM%2Flm0YBaTRZy9T1wIQcVWiUc0EEItbS7MylmGrPDgMjhi%2B0VacXXB2wG5XU3682NMXhTkwkSkrM9N2RljEZMM67ytYGOqUB3Qz8FPQGMMPvFL4wgBn82%2BUBFe2W4yV4SdLd9Wcb5cYwsu9NzyAGWOqi6spbqk%2FfweFcILKlLgcYZ8FcEkVT5LU0rI9YqdaFKRzJpeuknb1R94M2%2FZW6vtZz3PtICkDpTy0WvgneUIWJOm4fnhOPgdIJ9NF3Dh7tZyYODn0wV6uquf3Z1RhQoSvNYHvRLxdNOzt5a%2BFqBBmRDx5s5chn2vEdOIgH&X-Amz-Signature=1796b344b6b2ff0388fd80569e6000e21e9c4801d7a2fbac4f93e9715998e1c8&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1da5c571-bb7d-80a1-aca1-c9576b894b38.4b1b167f-4b52-4031-8233-f4f2689af574) 如果你以这种方式开始探索类型,你将几乎立刻遇到一些你还没见过的内容。以加法为例: ![](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=ASIAZI2LB4667TVL4YIG%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T223757Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDHqipfgRcwp9dXm2j0J%2B9%2BiIAmwHvhu2SeAlIJmV9gwQIgHg5SyJjq%2F3IhHJTEZC1hX5ClS7cO3NchcJ2w3ve8FFgqiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDM1WlSMdoneC9p3vhyrcA4P3BJInRYSeTylMm2mRQTET%2Fbp1zfK31AFSgi%2BEK40C18xX5blQcX9QfsjkiXR2jeGqa8Ig3qEu6zhHhXlWjQx0U4lKqNYQRkT%2BV%2BMhhf2R8paqfgVzh8nBk5ZorMnd5OCrIrjBCy5Dy9yoSsTY1ijrSMK3Dcy8thyoyrIfm%2BKO3NMFZ5hEbKbYfnCfoFzdh%2FcngeNoc1I08aUxQ4tAHbPz61bLmK78WCpF6FhX7%2FcoW7yoiBLE5wFU6SB%2B7ycg57i%2B75yR7dr7Tvv8vbZ2GnUMjhHap6P8ZVChOEQuuzHjiUsy0T9EgsXfOAG%2Fbx60j3Xn0n89Q5u5O53kmSLVUb0R79VPc2SFXT%2FSdh4cPORfXbS9meQRr64KAnWxsXkzKnBz8xmI6r0i3ZILBEuVetmZ5fmXAmeFjdYmmCzYaAxz%2FpYJdRRBn0xvKBO%2BBwdMbPrrcpP4ntVYeSidaE4ocf6gCx4QsYLNs2fzfGZEyINxC4T8AhcekhalZtbz3%2B3zj4tiKQhU46GonaqKWI68CguLGRrorXCG%2BRN6vT9JgM%2Flm0YBaTRZy9T1wIQcVWiUc0EEItbS7MylmGrPDgMjhi%2B0VacXXB2wG5XU3682NMXhTkwkSkrM9N2RljEZMM67ytYGOqUB3Qz8FPQGMMPvFL4wgBn82%2BUBFe2W4yV4SdLd9Wcb5cYwsu9NzyAGWOqi6spbqk%2FfweFcILKlLgcYZ8FcEkVT5LU0rI9YqdaFKRzJpeuknb1R94M2%2FZW6vtZz3PtICkDpTy0WvgneUIWJOm4fnhOPgdIJ9NF3Dh7tZyYODn0wV6uquf3Z1RhQoSvNYHvRLxdNOzt5a%2BFqBBmRDx5s5chn2vEdOIgH&X-Amz-Signature=608acecae8683c5aab5cf19dff506a71d781fe28eeb168f4575508eced461b3f&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1da5c571-bb7d-803f-b095-f8b27be8889c.4b1b167f-4b52-4031-8233-f4f2689af574) 尽管你已经花了这么多时间在类型上,像加法这样简单的操作仍然让你感到困惑!其中最大的谜团就是 `Num a =>` 这一部分。