2016-10-04 105 views
2

Haskell,堆栈构建工具。Haskell:模式匹配冗余

我有代码:

quote :: Char 
quote = '\'' 

doubleQuote :: Char 
doubleQuote = '\"' 

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

这将不erors进行编译,但是我在编译过程中看到消息:

d:\哈斯克尔\真正\程序\ Main.hs: 34:1:警告:[-Woverlapping图案]
模式匹配是多余
在方程`isBorder':isBorder双引号= ...

d:\ Haskell中\真实\应用\ Main.hs:35:1:警告:[-Woverlapping图案]
模式匹配是多余
在用于`isBorder'的等式:isBorder _ = ...

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

+1

如果您使用'-Wall'启用警告,您还应该看到“阴影”警告。 – chi

回答

8

当声明函数时,参数变量是新的名称。您的引用和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 

理念是先绑定参数名称和然后使用保护调用计算结果为布尔表达式。

+0

您可以将所有呼叫打包在一个顶级功能中。 – ThreeFx

+0

是的,我了解你,我认为你是对的。嗯......但是我看到我的代码也正常工作......所以哈斯克尔理解我在我的定义中所表达的意思。看看我的完整代码示例,请在这里:https://yadi.sk/d/MfyG7OmHwGmsV –

2

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

因此,编译器本质上看到:

isBorder x = True 
isBorder x = True 

因为quotedoublequote不是定义identifers但参数的名称。

+0

> *由于报价和双引号不是定义的标识符,而是参数的名称。* 嗯......但是我看到我的代码正常工作......所以哈斯克尔理解我在我的定义中所表达的意思。 –

+1

真的吗? 'isBorder'5''是否为假? – ThreeFx

+0

你是对的。我糟糕的测试了我的代码。谢谢! –