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 _ = ...
这是什么意思?我没有看到冗余...
答案 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
因为quote
和doublequote
不是定义的标识符,而是参数的名称。