サーチ…


構文

  1. インフィックス[整数]オペレーション
  2. infixl [整数]オペレーション
  3. infixr [整数]演算子

パラメーター

宣言コンポーネント意味
infixr オペレータは右結合である
infixl オペレータは左結合
infix 演算子は非結合である
任意の数字演算子のバインディング優先順位(範囲0〜9、デフォルト9)
op1, ... , opn 演算子

備考

演算子と関数を含む式を解析するために、Haskellは固定宣言を使用してかっこがどこに行くかを調べます。順序で、それ

  1. 関数アプリケーションを括弧で囲みます
  2. バインディング優先順位を使用して、同じ優先順位の演算子ですべて分離されたタームのグループをラップします。
  3. これらの演算子の連想性を使って、これらのグループに括弧を追加する方法を見つけます

ここでは、ステップ2の任意のグループの演算子はすべて同じ連想性を持たなければならないことに注意してください。実際には、Haskellはこの条件が満たされていないプログラムを拒否します。

上記のアルゴリズムの例として、 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1かっこを追加するプロセスを実行することができます。

infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
  1. 1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
  2. 1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
  3. (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です。

バインディングの優先順位

連想情報に続く数字は、演算子がどのような順序で適用されるかを表します。それは常にの間でなければなりません09以下です。これは、一般に、オペレータがどれくらい緊密に結びついているかと呼ばれます。たとえば、次の固定宣言(ベースで)を考えてみましょう。

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 ??


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow