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
更好,因为它更清楚地表明我们选择不处理空列表情况。