Операторы с более высоким приоритетом связываются более тесно, чем операторы с низким приоритетом.
Чтобы выяснить порядок, когда несколько выражений находятся в выражении, начните с оператора с наивысшим приоритетом и поместите круглые скобки вокруг выражений с обеих сторон, а затем продолжите его до приоритета оператора. Для операторов одного уровня вы определяете порядок на основе их определенной ассоциативности. Недопустимо смешивать операторы одного и того же уровня приоритета, но с разным ассоциативным поведением, так как группировка тогда неоднозначна Процедура, вероятно, знакома по работе с числовыми операторами:
2 + 3 * 5 - 1 + 2
-- * is infixl 7
2 + (3 * 5) - 1 + 2
-- + and - are infixl 6, so apply parens starting at the left
(2 + (3 * 5) - 1) + 2
((2 + (3 * 5)) - 1) + 2
Поскольку >>
имеет более высокий приоритет, чем $
, то же самое отношение применяется к
liftIO $ hClose port >> (return $ Bool True)
дает вам
liftIO $ (hClose port >> (return $ Bool True))
Итак, сначала hClose
и return $ Bool True
объединяются в выражение с типом IO (Bool')
, которое затем поднимается с помощью liftIO
. (Где Bool'
- любой тип Bool True
).
В отчете на Haskell подробно рассматривается синтаксис, в частности главы 2, 3 и 9.