This module implements the desugaring pass which reapplies binary operators based on their fixity data and removes explicit parentheses.
First, every binary operator $op$ has two attributes, associativity and priority.
This picture is from Haskell 2010 report.
The dilemma to solve is for sub-expression $a \, op_1 \, b \, op_2 \, c$, how should we group it?
If $op_1$ is larger than $op_2$ in priority, $(a \, op_1 \, b)$ is preferred as first group.
If they have same priority, then they are supposed to be of compatible direction of association. For example, the shared direction is left, then $(a \, op_1 \, b)$ is preferred as first group.
Next, the operator section.
This is about
(+ 1) or
(1 +) etc. We simply make them into proper abstraction.