返回文章列表

文章

Get Programming with Haskell-6

对于 Haskell(以及一般的函数式编程),基本数据结构是一个列表

部分内容超过 Notion API 单页读取上限,已尽力加载可访问内容。

目录
  1. 3、列表中的通用函数
  2. 1. 基础操作
  3. 2. 元素处理
  4. 3. 高阶函数
  5. 4. 特殊构造
  6. 5、zip 和 zipWith 的独特价值
  7. -- 安全处理不等长列表 names = ["Alice", "Bob"] ages = [25, 30, 35] ghci> zip names ages -- 自动截断 [("Alice",25), ("Bob",30)] 2. **数学运算**: haskell -- 向量点积 dotProduct xs ys = sum (zipWith (*) xs ys) 3. **惰性求值**:支持无限列表: haskell ghci> take 3 (zip [1..] ["a","b","c","d"]) [(1,"a"), (2,"b"), (3,"c")] ```
  8. 为何重要?
  9. 📎 参考文章
# Lists 列表(list)是函数式编程中**最重要的数据结构**,其核心优势在于它天生具有递归性。一个列表要么是空列表(**`[]`**),要么是一个元素后接另一个列表(**`元素 : 列表`**)。对列表的**拆解**和**构建**是函数式编程众多技术的基石。 拆解列表时,主要关注三个部分: - **头部(head)**:列表的第一个元素 - **尾部(tail)**:除头部外的剩余部分(仍是一个列表) - **末端(****`[]`****)**:空列表,表示递归终止条件 ## 1、列表的结构解析 ### 1、分解列表 列表由head和tail两部分组成 ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/d362c6fc-3273-4f4b-b601-cd9db11ec909/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YN5ZCGON%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231637Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDQMhEUQRj6GFuQfVCfdCGj8X9GEmejiAlYFsNIHphXQwIgJsY9ajr7THIPPDEtMyLPyqp3oUQEWUh1b42YzBqw%2FDYqiAQI7v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDNhNN5P25dh2k5DBgircA%2BvMcPLH4YogsMxEdwlQCr%2BL%2BZOY2H9Ddox3Mw6PvY1V0vKZdaKJZxgYq1E70Dll16YhtrIeJbnvI1UYJnTHnD4ZaSrtDW7B%2BeDc0R1Phu1il7V2AuWUxhNZ40JPLzt%2BP%2BUL3tYF7mPn8b5ed29IM8rA0%2BEyCVemRFGO5kUiNa1fTpOdEwnz3i4gbXfb%2Fvbqrhspzxuuk1FuRqBmb2b9v3B6vFhj%2BKV29nApML7xpPediZcBUxI4NJ1r7gwtPVsl9XhMr3Eo9fu4XFW%2FkMpDYhKlex88N5%2Fbf5bEXFIVclYMxXN4KhsZCicf5EeC3Pss%2BZQAoLPJXSXVz9o5i4jLf%2FJ9q2EyTzplzjSYxbbbbN97J4LSEKM7U5cBiGvTFaoyAZIcd4%2BdETY3gUn4po9afPfK%2BVWQnIEHGsVw7f4bkuUrRlTjfzsn9Mmv3oeo47ufGA7JDdmRMrjL9KOMYQ0pdW0XMx7MNIiqz5jOIMwVFABVSu0p%2Fqfxntl4H0kbeM1lHKe%2BZmHNnj9NdHVoN4B73ySdtKazA2XgUUApKMmj%2B9%2BN0V6ehmdVpkWeehuhIFHmGKk7vvJ%2BCBZ3SjH%2F1sg9N0NiVeYmk%2Fi5hnvwQgkEBzbjed3blZk0CVTKTsw9MOO8ytYGOqUBKCt1AATF%2BVpGds8m7ro%2FwrWbVahSbPxG4dL9dRdfi%2F3L8KGNySeHfwZmQ4sGwWEtV%2F77HwxZEoM7pCHz4Man0ijj9QLcu6e9ygrY4Awp8tHvdTOUPD1tF%2FmKxjULWUZAV8lqMt8%2BFygWVBVFF2mzNnvpaVdH%2FKu%2FCmKsX8PgVG6os8ctYF9Y8vLAf9WakMD8WUdWykZG8wGSPkcgGvFdyhHo93MJ&X-Amz-Signature=2652f84564a910919619043fd12f343051064e590360ec00872b76af74ec08aa&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d35c571-bb7d-802d-963c-cce12b9304a5.4b1b167f-4b52-4031-8233-f4f2689af574) `head` 函数是返回列表的第一个元素,`tail`是返回第一个元素后面的所有元素,如果列表只有一个元素,`tail`则返回空列表`[]`. ### 2、构造列表 构造列表我们需要使用`:` 操作符,这个操作符叫做`cons` ,来源于**Lisp**中的*construct*的缩写,在 Haskell 中,所有列表在底层均由一系列的 **`cons`**** 操作**(即 **`:`** 运算符)构成,而方括号 **`[...]`** 的表示法仅仅是语法糖(一种旨在提升代码可读性的语法特性)。
![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/20b69ab6-6639-4cf3-8230-2803be233346/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YN5ZCGON%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231637Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDQMhEUQRj6GFuQfVCfdCGj8X9GEmejiAlYFsNIHphXQwIgJsY9ajr7THIPPDEtMyLPyqp3oUQEWUh1b42YzBqw%2FDYqiAQI7v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDNhNN5P25dh2k5DBgircA%2BvMcPLH4YogsMxEdwlQCr%2BL%2BZOY2H9Ddox3Mw6PvY1V0vKZdaKJZxgYq1E70Dll16YhtrIeJbnvI1UYJnTHnD4ZaSrtDW7B%2BeDc0R1Phu1il7V2AuWUxhNZ40JPLzt%2BP%2BUL3tYF7mPn8b5ed29IM8rA0%2BEyCVemRFGO5kUiNa1fTpOdEwnz3i4gbXfb%2Fvbqrhspzxuuk1FuRqBmb2b9v3B6vFhj%2BKV29nApML7xpPediZcBUxI4NJ1r7gwtPVsl9XhMr3Eo9fu4XFW%2FkMpDYhKlex88N5%2Fbf5bEXFIVclYMxXN4KhsZCicf5EeC3Pss%2BZQAoLPJXSXVz9o5i4jLf%2FJ9q2EyTzplzjSYxbbbbN97J4LSEKM7U5cBiGvTFaoyAZIcd4%2BdETY3gUn4po9afPfK%2BVWQnIEHGsVw7f4bkuUrRlTjfzsn9Mmv3oeo47ufGA7JDdmRMrjL9KOMYQ0pdW0XMx7MNIiqz5jOIMwVFABVSu0p%2Fqfxntl4H0kbeM1lHKe%2BZmHNnj9NdHVoN4B73ySdtKazA2XgUUApKMmj%2B9%2BN0V6ehmdVpkWeehuhIFHmGKk7vvJ%2BCBZ3SjH%2F1sg9N0NiVeYmk%2Fi5hnvwQgkEBzbjed3blZk0CVTKTsw9MOO8ytYGOqUBKCt1AATF%2BVpGds8m7ro%2FwrWbVahSbPxG4dL9dRdfi%2F3L8KGNySeHfwZmQ4sGwWEtV%2F77HwxZEoM7pCHz4Man0ijj9QLcu6e9ygrY4Awp8tHvdTOUPD1tF%2FmKxjULWUZAV8lqMt8%2BFygWVBVFF2mzNnvpaVdH%2FKu%2FCmKsX8PgVG6os8ctYF9Y8vLAf9WakMD8WUdWykZG8wGSPkcgGvFdyhHo93MJ&X-Amz-Signature=71d4408b7492628e80883beaa31c704f5a760d4a560286db717a2e037e1695ca&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d35c571-bb7d-8035-b86a-ffebb6b8d18f.4b1b167f-4b52-4031-8233-f4f2689af574) 值得注意的是,目前你所见到的**字符串**本质上也是语法糖——它们实际上是**字符列表**(用双引号 **`" "`** 表示,而非单引号 **`' '`** 包裹的单个字符)
![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/91af5c1a-6dce-4249-a374-08d9bee62d83/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YN5ZCGON%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231637Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDQMhEUQRj6GFuQfVCfdCGj8X9GEmejiAlYFsNIHphXQwIgJsY9ajr7THIPPDEtMyLPyqp3oUQEWUh1b42YzBqw%2FDYqiAQI7v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDNhNN5P25dh2k5DBgircA%2BvMcPLH4YogsMxEdwlQCr%2BL%2BZOY2H9Ddox3Mw6PvY1V0vKZdaKJZxgYq1E70Dll16YhtrIeJbnvI1UYJnTHnD4ZaSrtDW7B%2BeDc0R1Phu1il7V2AuWUxhNZ40JPLzt%2BP%2BUL3tYF7mPn8b5ed29IM8rA0%2BEyCVemRFGO5kUiNa1fTpOdEwnz3i4gbXfb%2Fvbqrhspzxuuk1FuRqBmb2b9v3B6vFhj%2BKV29nApML7xpPediZcBUxI4NJ1r7gwtPVsl9XhMr3Eo9fu4XFW%2FkMpDYhKlex88N5%2Fbf5bEXFIVclYMxXN4KhsZCicf5EeC3Pss%2BZQAoLPJXSXVz9o5i4jLf%2FJ9q2EyTzplzjSYxbbbbN97J4LSEKM7U5cBiGvTFaoyAZIcd4%2BdETY3gUn4po9afPfK%2BVWQnIEHGsVw7f4bkuUrRlTjfzsn9Mmv3oeo47ufGA7JDdmRMrjL9KOMYQ0pdW0XMx7MNIiqz5jOIMwVFABVSu0p%2Fqfxntl4H0kbeM1lHKe%2BZmHNnj9NdHVoN4B73ySdtKazA2XgUUApKMmj%2B9%2BN0V6ehmdVpkWeehuhIFHmGKk7vvJ%2BCBZ3SjH%2F1sg9N0NiVeYmk%2Fi5hnvwQgkEBzbjed3blZk0CVTKTsw9MOO8ytYGOqUBKCt1AATF%2BVpGds8m7ro%2FwrWbVahSbPxG4dL9dRdfi%2F3L8KGNySeHfwZmQ4sGwWEtV%2F77HwxZEoM7pCHz4Man0ijj9QLcu6e9ygrY4Awp8tHvdTOUPD1tF%2FmKxjULWUZAV8lqMt8%2BFygWVBVFF2mzNnvpaVdH%2FKu%2FCmKsX8PgVG6os8ctYF9Y8vLAf9WakMD8WUdWykZG8wGSPkcgGvFdyhHo93MJ&X-Amz-Signature=ae6ff7ad1b760c6ebdbc4fb38df0878ca2e6d8efe7a6ee2c2ff51c9f29fe6be6&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d35c571-bb7d-80c3-9457-c327fda44e9a.4b1b167f-4b52-4031-8233-f4f2689af574) 需要牢记的是,在 Haskell 中,**列表的所有元素必须为同一类型**。例如,你可以将字符 **`'h'`** 通过 **`cons`** 操作(即 **`:`** 运算符)添加到字符串 **`"ello"`** 的开头,因为: - **`"ello"`** 本质上是一个字符列表(**`[Char]`**) - **`'h'`**(单引号包裹)是一个独立的 **`Char`** 类型字符 ```c++ Prelude> 'h':"ello" "hello" ``` 但你不能将 **`"h"`**(双引号)通过 **`cons`** 操作(**`:`**)拼接到 **`"ello"`** 前面,因为: - **`"h"`** 是一个**单元素的字符列表**(类型为 **`[Char]`**,等价于 **`['h']`**) - **`"ello"`** 中的元素是**独立的字符**(类型为 **`[Char]`**) **当去掉语法糖后,这一限制会变得更加直观**: ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/afa4b281-e4d2-4402-8f95-ad2f1a20e177/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YN5ZCGON%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231637Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCIQDQMhEUQRj6GFuQfVCfdCGj8X9GEmejiAlYFsNIHphXQwIgJsY9ajr7THIPPDEtMyLPyqp3oUQEWUh1b42YzBqw%2FDYqiAQI7v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDNhNN5P25dh2k5DBgircA%2BvMcPLH4YogsMxEdwlQCr%2BL%2BZOY2H9Ddox3Mw6PvY1V0vKZdaKJZxgYq1E70Dll16YhtrIeJbnvI1UYJnTHnD4ZaSrtDW7B%2BeDc0R1Phu1il7V2AuWUxhNZ40JPLzt%2BP%2BUL3tYF7mPn8b5ed29IM8rA0%2BEyCVemRFGO5kUiNa1fTpOdEwnz3i4gbXfb%2Fvbqrhspzxuuk1FuRqBmb2b9v3B6vFhj%2BKV29nApML7xpPediZcBUxI4NJ1r7gwtPVsl9XhMr3Eo9fu4XFW%2FkMpDYhKlex88N5%2Fbf5bEXFIVclYMxXN4KhsZCicf5EeC3Pss%2BZQAoLPJXSXVz9o5i4jLf%2FJ9q2EyTzplzjSYxbbbbN97J4LSEKM7U5cBiGvTFaoyAZIcd4%2BdETY3gUn4po9afPfK%2BVWQnIEHGsVw7f4bkuUrRlTjfzsn9Mmv3oeo47ufGA7JDdmRMrjL9KOMYQ0pdW0XMx7MNIiqz5jOIMwVFABVSu0p%2Fqfxntl4H0kbeM1lHKe%2BZmHNnj9NdHVoN4B73ySdtKazA2XgUUApKMmj%2B9%2BN0V6ehmdVpkWeehuhIFHmGKk7vvJ%2BCBZ3SjH%2F1sg9N0NiVeYmk%2Fi5hnvwQgkEBzbjed3blZk0CVTKTsw9MOO8ytYGOqUBKCt1AATF%2BVpGds8m7ro%2FwrWbVahSbPxG4dL9dRdfi%2F3L8KGNySeHfwZmQ4sGwWEtV%2F77HwxZEoM7pCHz4Man0ijj9QLcu6e9ygrY4Awp8tHvdTOUPD1tF%2FmKxjULWUZAV8lqMt8%2BFygWVBVFF2mzNnvpaVdH%2FKu%2FCmKsX8PgVG6os8ctYF9Y8vLAf9WakMD8WUdWykZG8wGSPkcgGvFdyhHo93MJ&X-Amz-Signature=41caad8ae215c8bde6e684a2011e883be2ee8398862015c37327172b85c1c5a6&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d35c571-bb7d-802c-ba8b-e5327ecbc282.4b1b167f-4b52-4031-8233-f4f2689af574)