图案与防护:否则不匹配



当给定空字符串时,以下两个函数的行为不同:

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 ""是什么?

相关内容

  • 没有找到相关文章

最新更新