列表推导

1. 简介

列表推导(List Comprehension)是 Haskell 中一种强大且简洁的语法,用于生成列表。它类似于数学中的集合推导,允许你通过简洁的语法生成新的列表。列表推导不仅易于理解,而且在处理列表时非常高效。

2. 基本语法

列表推导的基本语法如下:

[ expression | generator, predicate ]
  • expression:生成列表中每个元素的表达式。
  • generator:定义了如何生成元素的生成器。
  • predicate:可选的条件,用于过滤生成的元素。

2.1 生成器

生成器用于生成列表中的元素。常见的生成器形式是 variable <- list,其中 variable 是生成的变量,list 是源列表。

[ x | x <- [1..5] ]

这个表达式会生成一个包含 [1, 2, 3, 4, 5] 的列表。

2.2 条件(谓词)

条件用于过滤生成的元素。只有满足条件的元素才会被包含在最终的列表中。

[ x | x <- [1..10], x `mod` 2 == 0 ]

这个表达式会生成一个包含 [2, 4, 6, 8, 10] 的列表,因为只有偶数满足条件。

3. 示例

3.1 生成平方数列表

squares = [ x^2 | x <- [1..10] ]

这个表达式会生成一个包含 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 的列表。

3.2 生成偶数平方列表

evenSquares = [ x^2 | x <- [1..10], x `mod` 2 == 0 ]

这个表达式会生成一个包含 [4, 16, 36, 64, 100] 的列表。

3.3 生成笛卡尔积

cartesianProduct = [ (x, y) | x <- [1, 2, 3], y <- ['a', 'b'] ]

这个表达式会生成一个包含 [(1,'a'), (1,'b'), (2,'a'), (2,'b'), (3,'a'), (3,'b')] 的列表。

4. 实践练习

4.1 练习1:生成斐波那契数列

编写一个列表推导语句,生成前 10 个斐波那契数列。

fibs = [ fib | n <- [0..9], let fib = if n <= 1 then n else fibs !! (n-1) + fibs !! (n-2) ]

4.2 练习2:生成素数列表

编写一个列表推导语句,生成前 20 个素数。

primes = [ x | x <- [2..], all (\p -> x `mod` p /= 0) [2..x-1] ]

4.3 练习3:生成字符串列表

编写一个列表推导语句,生成一个包含所有小写字母的字符串列表。

lowercaseLetters = [ [chr x] | x <- [97..122] ]

5. 总结

列表推导是 Haskell 中一种非常强大的工具,能够以简洁的方式生成和处理列表。通过掌握列表推导的基本语法和应用场景,你可以在编写 Haskell 代码时更加高效和优雅。

6. 进阶阅读

通过这些资源,你可以进一步深入了解列表推导的高级用法和更多实际应用场景。