2016-10-04 8 views
2

Haskell、Stackビルドツール。Haskell:パターンマッチングは冗長です

私が持っているコード:

quote :: Char 
quote = '\'' 

doubleQuote :: Char 
doubleQuote = '\"' 

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

それはerorsなしでコンパイルが、私はコンパイル時にメッセージが表示されます。

D:\ Haskellの\本物の\アプリ\ Main.hs: 1:34警告:[-Woverlapping-パターン]
パターンマッチは `isBorder 'についての式において
冗長である:isBorderダブルクォート= ...

D:Main.hs \ \ハスケル\実\アプリ:1:35警告:[-Woverlapping-パターン]
パターンマッチは `isBorder 'についての式において
冗長である:isBorder _ = ...

この意味は?私は冗長性を見ません...

+1

「-Wall」で警告を有効にすると、「シャドーイング」警告が表示されるはずです。 – chi

答えて

8

関数を宣言するとき、引数変数はnewの名前です。あなたのquoteと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

すべてのコールを1つのトップレベル関数にまとめることができます。 – ThreeFx

+0

はい、私はあなたを理解し、あなたが正しいと思います。うーん...しかし、私のコードは正しく動作することがわかります...だから、Haskellは私の定義で何を意味しているのか理解しています。私の完全なコード例をご覧ください。https://yadi.sk/d/MfyG7OmHwGmsV –

2

パターンは、識別子に対してではなく、具体的な値に対してのみ照合できます。

ので、コンパイラは、本質的に見ている:

isBorder x = True 
isBorder x = True 

quotedoublequoteが定義されてidentifersが、パラメータの名前ではないからです。

+0

> *引用符と二重引用符は定義された識別子ではなく、パラメータの名前* うーん...しかし、私のコードが正しく動作することがわかります...したがって、ハスケルは私の定義の意味を理解しています。 –

+1

本当ですか? 'isBorder 'は' false'ですか? – ThreeFx

+0

あなたは正しいです。私は自分のコードを悪くテストしました。ありがとうございました! –