Haskell:模式匹配是多余的

And*_*man 4 haskell pattern-matching

Haskell,Stack构建工具.

我有代码:

quote :: Char
quote = '\''

doubleQuote :: Char
doubleQuote = '\"'

isBorder :: Char -> Bool
isBorder quote = True
isBorder doubleQuote = True
isBorder _ = False
Run Code Online (Sandbox Code Playgroud)

它将在没有错误的情况下编译,但我在编译期间看到了消息:

D:\ haskell\real\app\Main.hs:34:1:警告:[-Woverlapping-patterns]
模式匹配是多余的
在`isBorder'的等式中:isBorder doubleQuote = ...

D:\ haskell\real\app\Main.hs:35:1:警告:[-Woverlapping-patterns]
模式匹配是多余的
在`isBorder'的等式中:isBorder _ = ...

这是什么意思?我没有看到冗余......

hao*_*hao 10

声明函数时,参数变量是名称.你的引用和doubleQuote是阴影函数,而不是调用模式匹配的函数.通过这种方式,模式匹配的语言巧妙地偏离了右手边表达的语言.为了实现你想要的,要么做到

isBorder :: Char -> Bool
isBorder '\'' = True
isBorder '\"' = True
isBorder _ = False
Run Code Online (Sandbox Code Playgroud)

要么

isBorder :: Char -> Bool
isBorder c | quote == c = True
isBorder c | doubleQuote == c = True
isBorder _ = False
Run Code Online (Sandbox Code Playgroud)

理念是首先将参数绑定到name,然后使用guard来调用一个计算结果为布尔值的表达式.