递归, 守卫表达式, 模式¶
递归 (Recursion)¶
函数式编程不存在类似 for 的循环语句, 因为这类循环通常需要可变变量, 但函数式编程不存在可变变量.
因此函数式编程使用递归而非迭代.
下面实现阶乘函数 factorial:
近似的命令式代码如下:
互递归 (Mutual recursion)¶
守卫表达式 (Guards)¶
其中 otherwise 是 True 的同义词:
如果之前的表达式都为 False, 最后的 otherwise 可以用于处理其他剩余情况.
类似于命令式编程语言里 switch 语句中的 default, 或者 Rust 语言 match 语句中的 _ 表达式.
模式 (Patterns)¶
模式匹配将从上向下寻找第一个匹配的模式, 所以下面的 is_zero 函数将永远返回 False:
与上面的实现方法相比, 由于该 factorial 函数实现缺少对 n 为负数情况的处理, 但 n 为负数时将导致无限循环.
与 if 和守卫表达式相比, 模式匹配只能匹配具体的值, 无法编写表达式.
例子¶
函数 drop' 用于 "丢弃" 列表中的前 n 个元素, 并返回剩余元素:
函数 maximum' 用于求列表中的最大值:
maximum' [] = error "Cannot be called on an empty list"
maximum' [x] = x
maximum' (x:xs) = if x > maximum' xs then x else maximum' xs
上述代码中的 (x:y:xs) 模式匹配只能在编译时决定从列表中提取元素的数量.
如果需要在运行时指定可以借助 take 和 drop 函数来实现: