文章
Get Programming with Haskell-6
对于 Haskell(以及一般的函数式编程),基本数据结构是一个列表
部分内容超过 Notion API 单页读取上限,已尽力加载可访问内容。
目录
- 3、列表中的通用函数
- 1. 基础操作
- 2. 元素处理
- 3. 高阶函数
- 4. 特殊构造
- 5、zip 和 zipWith 的独特价值
- -- 安全处理不等长列表 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")] ```
- 为何重要?
- 📎 参考文章
 值得注意的是,目前你所见到的**字符串**本质上也是语法糖——它们实际上是**字符列表**(用双引号 **`" "`** 表示,而非单引号 **`' '`** 包裹的单个字符)
 需要牢记的是,在 Haskell 中,**列表的所有元素必须为同一类型**。例如,你可以将字符 **`'h'`** 通过 **`cons`** 操作(即 **`:`** 运算符)添加到字符串 **`"ello"`** 的开头,因为: - **`"ello"`** 本质上是一个字符列表(**`[Char]`**) - **`'h'`**(单引号包裹)是一个独立的 **`Char`** 类型字符 ```c++ Prelude> 'h':"ello" "hello" ``` 但你不能将 **`"h"`**(双引号)通过 **`cons`** 操作(**`:`**)拼接到 **`"ello"`** 前面,因为: - **`"h"`** 是一个**单元素的字符列表**(类型为 **`[Char]`**,等价于 **`['h']`**) - **`"ello"`** 中的元素是**独立的字符**(类型为 **`[Char]`**) **当去掉语法糖后,这一限制会变得更加直观**: 