Haskell/解决方案/模式匹配
外观
| 练习 |
|---|
|
1.
在用于模式匹配时,像 h 中的 k 这样的简单变量名
h k = True
将 k 绑定到 h 的参数,并且至关重要的是,匹配任何东西。由于我们在等式右侧没有使用绑定的 k 变量,因此在这个函数中,这个定义的效果与
h _ = True
相同,这就是 GHC/GHCi 会抱怨模式重叠,以及为什么 h 的第二个等式被忽略。此外,在函数外部定义的 k = 1 定义不会影响发生的事情 - 用于模式匹配的 k 具有局部作用域(h 等式的作用域),并且与其他 k 无关。
2.
Bool 不是字面量值;相反,它是一个代数数据类型,就像我们在上一章中首次遇到的那样。本质上,它在 Prelude 中的定义等同于
data Bool = False | True
False 和 True 是无参数构造函数;这就是为什么它们的名字以大写字母开头。
| 练习 |
|---|
实现 scanr,如 列表 III 中的练习所示,但这次使用 as 模式。 |
myScanr step zero [] = [zero]
myScanr step zero (x:xs) = (step x y):ys
where ys@(y:_) = myScanr step zero xs
你可能在第一个版本的练习中使用了 head 而不是 as 模式;但是,在这里,我们没有在 ys 的模式中匹配空列表。在这种特定情况下,两种解决方案都不是不安全的,因为 myScanr 的结果永远不会是空列表。然而,模式匹配仍然比 head 更好,因为它更清楚地表明我们选择不处理空列表情况。