Pattern match is redundant

痞子三分冷 提交于 2019-12-10 15:37:08

问题


Haskell, Stack build tool.

I have code:

quote :: Char
quote = '\''

doubleQuote :: Char
doubleQuote = '\"'

isBorder :: Char -> Bool
isBorder quote = True
isBorder doubleQuote = True
isBorder _ = False

It will be compiled without erors, but I see the messages during the compilation:

D:\haskell\real\app\Main.hs:34:1: warning: [-Woverlapping-patterns]
Pattern match is redundant
In an equation for `isBorder': isBorder doubleQuote = ...

D:\haskell\real\app\Main.hs:35:1: warning: [-Woverlapping-patterns]
Pattern match is redundant
In an equation for `isBorder': isBorder _ = ...

What does it mean? I don't see redundance...


回答1:


When declaring functions, the argument variables are new names. Your quote and doubleQuote are shadowing the functions rather than invoking the functions for pattern matching. In this way the language of pattern matching subtly deviates from the language of right-hand-sided expressions. To achieve what you want, either do

isBorder :: Char -> Bool
isBorder '\'' = True
isBorder '\"' = True
isBorder _ = False

or

isBorder :: Char -> Bool
isBorder c | quote == c = True
isBorder c | doubleQuote == c = True
isBorder _ = False

The philosophy is to first bind the argument to name and then to use a guard to invoke an expression that evaluates to a boolean.




回答2:


The pattern can only be matched against concrete values, not against identifiers.

So the compiler essentially sees:

isBorder x = True
isBorder x = True

since quote and doublequote aren't the defined identifers but the names of the parameters.



来源:https://stackoverflow.com/questions/39862667/pattern-match-is-redundant

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!