当给定空字符串时,以下两个函数的行为不同:
guardMatch l@(x:xs)
| x == '-' = "negative " ++ xs
| otherwise = l
patternMatch ('-':xs) = "negative " ++ xs
patternMatch l = l
这里是我的输出:
*Main> guardMatch ""
"*** Exception: matching.hs:(1,1)-(3,20): Non-exhaustive patterns in function guardMatch
*Main> patternMatch ""
""
问题:为什么"otherwise"关闭不能捕获空字符串?
otherwise
在模式l@(x:xs)
的范围内,该模式只能匹配非空字符串。这可能有助于了解这(有效地(在内部转化为什么:
guardMatch l = case l of
(x :xs) -> if x == '-' then "negative " ++ xs else l
patternMatch l = case l of
('-':xs) -> "negative " ++ xs
_ -> l
(实际上,我认为if
被转换为case
+防护,而不是相反。(
始终在模式之后评估保护。这是-如果模式成功,则尝试保护。在您的情况下,模式(x:xs)
排除了空字符串,因此甚至没有尝试保护,因为模式失败了。
其他两个答案当然是完全正确的,但这里有另一种思考方式:如果你写了这个呢?
guardMatch l@(x:xs)
| x == '-' = "negative " ++ xs
| otherwise = [x]
你期望guardMatch ""
是什么?