次のような優先順位の低い (lowMult) 中置演算子を定義しました。
a `lowMult` b = a*b
infix 1 `lowMult`
しかし、 GHCi
が : のようなリスト内包 表記では、演算子 ( ) は固定性を持っているように見えます。GHCi は前のリスト内包表記を次のように評価8-1 `lowMult` 4 + 2
します。42
[8 - 1 `op` 4 + 2 | op <- [lowMult]]
op
(*)
[6]
次のような優先順位の低い (lowMult) 中置演算子を定義しました。
a `lowMult` b = a*b
infix 1 `lowMult`
しかし、 GHCi
が : のようなリスト内包 表記では、演算子 ( ) は固定性を持っているように見えます。GHCi は前のリスト内包表記を次のように評価8-1 `lowMult` 4 + 2
します。42
[8 - 1 `op` 4 + 2 | op <- [lowMult]]
op
(*)
[6]
Haskell では、固定性はnameごとに定義されます。そのため、演算子に新しい名前を定義すると、その名前には独自の固定性があり、元の名前とは異なります。
リスト内包表記では、lowMult
--の新しい名前を定義しますop
。の固定性を指定しないためop
、既定のレベルが取得されます。これは、左結合性を使用した可能な限り高い固定性です。これにより、乗算よりもさらに強くバインドされます。
この動作は、実際には唯一の論理的な選択です。そうでなければ、このシナリオで何をしますか?
[8 - 1 `op` 4 + 2 | op <- [lowMult, (*)]]
演算子が引数として渡された場合、またはより複雑な式自体の結果が渡された場合はどうなるでしょうか? すべての演算子の固定性はコンパイル時に定義する必要があるため、このような実行時情報に依存することはできません。