文章
Get Programming with Haskell-18
到目前为止,我们已经讨论了类型如何像数据一样被加和乘。 像函数一样,类型也可以接受参数。类型通过在其定义中使用类型变量来接受参数(因此它们的参数总是其他类型)。使用参数定义的类型称为参数化类型。参数化类型在 Haskell 中扮演着重要的角色,因为它们允许你定义可以与各种现有数据一起使用的通用数据结构。
目录
- 2. 具有多个参数的类型
- 2.1 Tuples
- 2.3 Data.Map
- 这行代码导入了 Data.Map 模块,并为它指定了一个限定名称 Map。这意味着,要使用 Data.Map 模块中定义的函数和类型构造器,你需要使用 Map. 前缀。例如,要创建一个空的 Map,你需要写成 Map.empty,而不是直接使用 empty。这样做可以避免与 Prelude 中可能存在的同名函数发生命名冲突。 Map 类型是一个关联数据结构,它可以存储键值对,其中所有的键都具有相同的类型,并且所有的值也都具有相同的类型(但键和值的类型可以不同)。Map 提供了高效的查找、插入和删除操作。它的类型签名通常是 Map k v,其中 k 是键的类型,v 是值的类型。因此,Map 是一个接受两个类型参数的参数化类型,其种类是 * -> * -> *。
- 3. Summary
- 📎 参考文章
## 1. 接受参数的类型 如果你熟悉 C# 和 Java 等语言中的类型泛型,那么参数化类型最初看起来会很相似。与 C# 和 Java 中的泛型一样,参数化类型允许你创建可以容纳其他类型的“容器”。例如,`List` 表示一个只包含字符串的列表,而 `KeyValuePair` 表示一对值,其中一个 `int` 作为 `string` 的键。通常,你使用泛型类型来约束容器类型可以接受的值的类型,从而使其更易于使用。在 Haskell 中,情况也是如此。 你可以创建的最基本的参数化类型是一个 `Box`,它可以作为任何其他类型的容器。`Box` 类型相当于你的简单函数,但用于参数化类型(本课的代码将放入 `Lesson18.hs` 文件中)。图 18.1 详细说明了 `Box` 的定义。  `Box` 类型是一个抽象的容器,可以容纳任何其他类型。一旦你将一个类型放入 `Box` 中,`Box` 类型就会呈现一个具体的类型。你可以使用 GHCi 来探索其中的一些: ```haskell ghci> n = 6 :: Int ghci> :t Box n Box n :: Box Int ghci> word = "box" ghci> :t Box word Box word :: Box String ghci> f x = x ghci> :t Box f Box f :: Box (p -> p) ghci> otherBox = Box n ghci> :t Box otherBox Box otherBox :: Box (Box Int) ```