あどけない話

インターネットに関する技術的な話など

無名関数と>>=に関する質問

ご存知の方がいらっしゃったら、教えて下さい。>>= と -> の結合順位についてです。(-> の方は結合順位じゃない気もします。)

演算子 >>= は、左結合のはずです。

m >>= f >>= g   ==   (m >>= f) >>= g

ここで、無名関数と >>= を組み合わせた式を考えてみます。

Just 0 >>= \x -> Just 1 >>= \y -> Just (x,y)
→ Just (0,1)

>>= が左結合なら、以下のように括弧を付けてもいいはずですが、エラーとなります。

(Just 0 >>= \x -> Just 1) >>= \y -> Just (x,y)
→ エラー

試しに、右結合かのように括弧を付けると、正しく評価されます。

Just 0 >>= (\x -> Just 1 >>= \y -> Just (x,y))
Just (0,1)

考えた末に、これは、こういうことかと思いました。

Just 0 >>= \x -> (Just 1 >>= \y -> Just (x,y))
Just (0,1)

すなわち、-> を演算子と考えるなら、-> は右結合であって、>>= よりも低い結合順位を持つと。

そう考えると、最後の式で x が参照できる理由も分かります。また、

Just 0 >>= \x ->
Just 1 >>= \y ->
Just (x,y)

と書ける理由も分かります。

ただ、仕様書を読んでも、どこにもそうとは書いてありませんでした。どこかに、このことを裏付ける記述はないでしょうか?