返回文章列表

文章

Get Programming with Haskell-18

到目前为止,我们已经讨论了类型如何像数据一样被加和乘。 像函数一样,类型也可以接受参数。类型通过在其定义中使用类型变量来接受参数(因此它们的参数总是其他类型)。使用参数定义的类型称为参数化类型。参数化类型在 Haskell 中扮演着重要的角色,因为它们允许你定义可以与各种现有数据一起使用的通用数据结构。

目录
  1. 2. 具有多个参数的类型
  2. 2.1 Tuples
  3. 2.3 Data.Map
  4. 这行代码导入了 Data.Map 模块,并为它指定了一个限定名称 Map。这意味着,要使用 Data.Map 模块中定义的函数和类型构造器,你需要使用 Map. 前缀。例如,要创建一个空的 Map,你需要写成 Map.empty,而不是直接使用 empty。这样做可以避免与 Prelude 中可能存在的同名函数发生命名冲突。 Map 类型是一个关联数据结构,它可以存储键值对,其中所有的键都具有相同的类型,并且所有的值也都具有相同的类型(但键和值的类型可以不同)。Map 提供了高效的查找、插入和删除操作。它的类型签名通常是 Map k v,其中 k 是键的类型,v 是值的类型。因此,Map 是一个接受两个类型参数的参数化类型,其种类是 * -> * -> *。
  5. 3. Summary
  6. 📎 参考文章
# 参数化类型
## 1. 接受参数的类型 如果你熟悉 C# 和 Java 等语言中的类型泛型,那么参数化类型最初看起来会很相似。与 C# 和 Java 中的泛型一样,参数化类型允许你创建可以容纳其他类型的“容器”。例如,`List` 表示一个只包含字符串的列表,而 `KeyValuePair` 表示一对值,其中一个 `int` 作为 `string` 的键。通常,你使用泛型类型来约束容器类型可以接受的值的类型,从而使其更易于使用。在 Haskell 中,情况也是如此。 你可以创建的最基本的参数化类型是一个 `Box`,它可以作为任何其他类型的容器。`Box` 类型相当于你的简单函数,但用于参数化类型(本课的代码将放入 `Lesson18.hs` 文件中)。图 18.1 详细说明了 `Box` 的定义。 ![图 18.1 Definition of the Box parameterized type](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/34ae0172-3688-43e4-89f9-822a8d1aa634/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YU5XSIQD%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T175007Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJHMEUCIFIGDV4RQ73r8CswiTiyIhdwFGuIwQHCn8XNonNyk90wAiEA0cVeO5GWQD%2FOqjebh4yPOdhDYJTsDYXI3b14rXuzouwq%2FwMIOhAAGgw2Mzc0MjMxODM4MDUiDH5J1I%2BPO%2B6Wl0xCbircAzWz6IN9WkcZKel4yQ7vXqghyeDlAj0NVAh6FRt6TA7bwkEYDeFfs56c77DEdHEPLQWKLYXJ28uMvjh90W4f0X1YjM7PYQuXi8lUyd8gUuY70sMQ%2BKs%2FU8UGVZMWkWDiTkQsar%2FeWeuk%2Bn3keGzOn%2BQUeDw%2BMghDcbJy1eE4%2Fzxp21UOJzEX%2BbPdyu7NG36LGNouYtX3gcSup%2FehtLSdDlkpO%2FedVofw2cyxtpWtZkMCyD19os4v2Kx%2B2xbAhV6nsGjXgI5mORtytIqIHFrarmhft2L4kVs4j%2FUXMrf06%2FB%2Bq0vg70foOnf4xUnU21QN0gALW6ZKp%2BOARITmF6zwRXbjHWgq2%2Fpuxr7PB%2F%2BK%2FsAs80Vd33t4z8vYxpnzmh8OwMyF0ntBVq5YNaNokCVC7fXgFfbkq1a2a0iXiSqIc1tGhAwv0rAbuQc8G3EAe3U0IR%2FfmV1Dd6MFM%2FQUm53mp2tVlBlQFh9kPD16kzqYosP%2F8JF1OovPy3F5AXirAF5HQGAG%2F5L0CUCknTxv8CqOryKG6n8yRHQ%2FWMi1NvgzC2JlzIqsqDy4J2WfrAdFUwqlfHGwCBd2%2F8oqR3vswF%2FB%2BitUJ%2F5s%2FG%2FniQotyMiRbr1WYNfOCeXSrHBHk5swMJ3NwdQGOqUB74cbhu0pzpI4AKxrVpCQeSylhTLrCeCt88xUcUpWV5%2BIt9pLjNCe6eCjrpWuypK8fAlnm6RjHp7sz%2BrXghpbNI20yknrR62kuS%2FP%2F9cso4aanN6vCV9rsCXQguKSnWLqYnodAdsh606N44B1BmA%2FyWOL%2FBadvGXJgQWoVjs6NOocg2ImMZlhxb2PpYE0BkfnZGeYkH6t5pN6F3bGPjBbVPcEjrHX&X-Amz-Signature=e9fad74e8455dfbb2f5e256cfdcdfbae3c743457c5279bf59bb6e1bc5ffadad1&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) `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) ```