Haskell Language
耐性宣言
サーチ…
構文
- インフィックス[整数]オペレーション
- infixl [整数]オペレーション
- infixr [整数]演算子
パラメーター
宣言コンポーネント | 意味 |
---|---|
infixr | オペレータは右結合である |
infixl | オペレータは左結合 |
infix | 演算子は非結合である |
任意の数字 | 演算子のバインディング優先順位(範囲0〜9、デフォルト9) |
op1, ... , opn | 演算子 |
備考
演算子と関数を含む式を解析するために、Haskellは固定宣言を使用してかっこがどこに行くかを調べます。順序で、それ
- 関数アプリケーションを括弧で囲みます
- バインディング優先順位を使用して、同じ優先順位の演算子ですべて分離されたタームのグループをラップします。
- これらの演算子の連想性を使って、これらのグループに括弧を追加する方法を見つけます
ここでは、ステップ2の任意のグループの演算子はすべて同じ連想性を持たなければならないことに注意してください。実際には、Haskellはこの条件が満たされていないプログラムを拒否します。
上記のアルゴリズムの例として、 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1
かっこを追加するプロセスを実行することができます。
infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
-
1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
-
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
-
(1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))
Haskell 98レポートのセクション4.4.2の詳細。
関連性
infixl
vs infixr
vs infix
括弧をどの辺にグループ化するかを記述する。たとえば、次の固定宣言(ベースで)を考えてみましょう。
infixl 6 -
infixr 5 :
infix 4 ==
infixl
ことを教えてくれる-
結合性を残していることを意味する1 - 2 - 3 - 4
として解析されます
((1 - 2) - 3) - 4
infixr
は、右の結合性を持っていることを示してい:
つまり、 1 : 2 : 3 : []
は次のように解析されます。
1 : (2 : (3 : []))
infix
は、 ==
は括弧を含めて使用できないことを意味します。つまり、 True == False == True
は構文エラーです。一方、 True == (False == True)
または(True == False) == True
は問題ありません。
明示的な固定宣言を持たない演算子はinfixl 9
です。
バインディングの優先順位
連想情報に続く数字は、演算子がどのような順序で適用されるかを表します。それは常にの間でなければなりません0
と9
以下です。これは、一般に、オペレータがどれくらい緊密に結びついているかと呼ばれます。たとえば、次の固定宣言(ベースで)を考えてみましょう。
infixl 6 +
infixl 7 *
*
は+
よりも高い結合優先順位を持っているので、 1 * 2 + 3
を
(1 * 2) + 3
手短に言えば、数字が高いほど、操作者は、その両側にある括弧を「引っ張る」ことになります。
備考
関数アプリケーションは常に演算子より上位にバインドされるので、演算子
`op`
とその固定性宣言が`op`
は(fx)
op(gy)
fx `op` gy
(fx)
として解釈されなければなりません。固定の宣言でバインディングの優先順位が省略されている場合(たとえば
infixl *!?
ある場合)、デフォルトは9
です。
宣言の例
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??