2016-10-04 138 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

你是對的。我糟糕的測試了我的代碼。謝謝! –