返回文章列表

文章

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=ASIAZI2LB4662B2IR6HY%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T223200Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQC%2FN4qe42VMvruyLuFYqjH4jYr%2BHvfa1AQRW%2BQFgnXjWAIgCLEfPB0U%2B8SmTFl%2BIHCWSDVFsMvRl%2FjIOBQJ8iqAffsqiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDPxB4tKgLCzecD%2FfeircA9dV%2FerkCsohG6XaaBcA1RIFkJGSYb8d1sz4t%2BFHoJ8j9seDIU8lHV3godfpqaRDsD0PxVha%2BPSZUbSDllPTENWphOmW1MT3t%2BOQPD%2FFTzQ4y8quoB59DwtaiL69N3a%2FsR%2BMpaEV52CBQ8WjM%2FvKFD7HZM0earRx%2BZENX2C1K1kPivFLcUHFdVUIkwbHp9EIYBr%2B42b7GwcRrlUoUMtpWH%2B6fZN4ku%2BSiuJshQcMuY00u7nJKv5KjQCeCYWaWs9k6wZdqF%2BBkmqOhxC7oFhdLSOdIZj7gJ0Q9qkcUqMfX%2FM%2BIFH3%2FUolKbfTDLl9Bx%2BoRB2xgJzljtr246QUkUtcGJ1zdW6xukLHKuzqC7bnCfh%2F9dHMGFgmeqC2E%2F1WqKuW3Dp7Y7BQ7x3QpYpB85s1wJxuyEny1LlksbL5PcbeQ1my2TEp8Vkzw5pL7M1l1MZ8lPxMOeGgW2wxJOCPqwBQT%2FantXD4ilcJZ8TgnQixsGH0hADaXxddG0kmMgKGW9EYqZuDQrxUKuo2CLJul4oCG6bXMVCvsZa3W0vPHMD7HDew%2B%2FWO0%2BpK6k60RqJTRbOhF9eGF7MoA%2F3xck5tqKIHm0vSALT84D5HjqGWw71FwemIc3tQMi405nYWEIDCMK%2B7ytYGOqUBoapHhzD5RkygK6%2FqzS5oIGmK1iT%2Fje6mu1Jo15c8rvMqJPUPTjv1nTUAaiyGcYj1WqcE5Eyb2vd8luwYvgDNglKhecG2fJP0%2FGRN09HHJoZOEQHmInUrxrKorxlThC55cBsOB7jMPvABvcexXhIAhGegXSYRQWa5qXy5MoB7e%2FCXdJpnxDP71%2FM79VTaY%2BySqcqz4WiM7N9ecL3bCjf4ZMKC7qV%2B&X-Amz-Signature=bdb95e3fa30cf3dd0f4ea9ff5ceb399ba87d6cc57cc76922f382cf2d9f3f5773&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1df5c571-bb7d-80af-be54-fe45185451b9.4b1b167f-4b52-4031-8233-f4f2689af574) `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) ```