Haskell:模式匹配是多余的

时间:2016-10-04 22:22:24

标签: haskell pattern-matching

Haskell,Stack构建工具。

我有代码:

quote :: Char
quote = '\''

doubleQuote :: Char
doubleQuote = '\"'

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

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

  

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 _ = ...

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:2)

模式只能与具体值匹配,而不能与标识符匹配。

所以编译器基本上看到了:

isBorder x = True
isBorder x = True

因为quotedoublequote不是定义的标识符,而是参数的名称。