The reserved symbols ' and ! bind more tightly than function application, So 'f x is the same as (_ -> f) x and !x + y is the same as (x ()) + y.
These symbols bind less tightly than keywords that introduce blocks, so do x and 'let x are both the same as _ -> let x and !if b then p else q is the same as (if b then p else q) ().
Additional ' and ! combine in the following way:
do do syntacticPrecedence.xis the same as(_ -> (_ -> x))or(_ _ -> x).!!xis the same asx () ().!'xand'!xare both the same asx.
You can use parentheses to precisely control how ' and ! get applied.