2010-12-13 5 views
2

だからGHCiのを使用して、これらのステートメントは等価ですend0でリスト式はEND1でリスト式のシンタックスシュガーであるため、私には理にかなっている:GHCIのHaskell:なぜパターンを一致させるために括弧が必要なのですか?

let end0 [x,y,z] = z 

let end1 (x:y:z:[]) = z 

しかしEND1のパターンのうち、括弧を取ることは私を与えます「パターンの解析エラー」エラー。ではなぜですか?括弧はパターンマッチで特別な意味を持っているのですか?それとも、私が演算子で括弧を使用するときに普通考えるような優先順位の問題ですか?

+4

注:これはGHCiに固有の問題ではありません。 – delnan

+0

ああ、私はGHCIタグを削除して、それをHaskellだけにする必要がありますか?私はGHCIでこれらのコンストラクトを通常使用するので、私はそれがまだ関連していると思います。 – spade78

+2

通常、GHCi以外のパターンマッチングはしていませんか?これは、コンストラクタに関係するすべての一致に該当するためです。 – Chuck

答えて

6

これは優先順位と関係があります。

関数は:よりも優先されます。したがって、GHCは、xの関数のみを定義していると推測します。だから、あなたはそれを括弧の中に詰め込まなければならないのです。

+3

関数の適用が*すべて* – luqui

+2

よりも優先されますレコードの更新を除いて...一般的に人々はそれが真実ではないふりをします。 – luqui

+1

穏やかなHaskell入門から: "関数アプリケーションは、中置演算子よりも高い優先順位を持っています"。 http://www.cs.auckland.ac.nz/references/haskell/haskell-intro-html/functions.html – rapfaria

6

括弧なしでは、それはlet (end1 x):y:z:[] = zとして解析されるためです。

関連する問題