Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Machinery for deciding whether an expression needs to be wrapped in parentheses or not.
Synopsis
- type Precedence = Double
- data Associativity
- data FixityOver prec = Fixity {}
- type Fixity = FixityOver Precedence
- data Direction
- data RenderContextOver prec = RenderContext {}
- type RenderContext = RenderContextOver Precedence
- encloseIn ∷ Ord prec ⇒ (a → a) → RenderContextOver prec → FixityOver prec → a → a
- botFixity ∷ Fixity
- juxtFixity ∷ Fixity
- unitFixity ∷ Fixity
- topFixity ∷ Fixity
- botRenderContext ∷ RenderContext
- topRenderContext ∷ RenderContext
Documentation
type Precedence = Double Source #
Fractional precedence, so that it's always possible to squeeze an operator precedence between
two existing precedences. Ranges over [-20, 120]
. A normal operator should have a precedence
within [0, 100)
. It might be useful to have a negative precedence if you're trying to model
some already existing system, for example in Haskell ($)
has precedence 0
, but clearly
if b then y else f $ x
should be rendered without any parens, hence the precedence of
if_then_else_
is less than 0, i.e. negative.
The precedence of juxtaposition is 100
. Normally you want juxtaposition to have the highest
precedence, but some languages have operators that bind tighter than juxtaposition, e.g.
Haskell's postfix _{_}
: f z { x = y }
means f (z {x = y})
.
data Associativity Source #
Associativity of an operator.
Instances
Show Associativity Source # | |
Defined in Text.Fixity.Internal | |
Eq Associativity Source # | |
Defined in Text.Fixity.Internal (==) ∷ Associativity → Associativity → Bool Source # (/=) ∷ Associativity → Associativity → Bool Source # |
data FixityOver prec Source #
Fixity of an operator.
We allow unary operators to have associativity, because it's useful to distinguish
between an expression like -(-x)
(unary minus, left-associative) and ~~b
(boolean NOT, right-associative).
Associativity of unary operators also matters when pretty-printing expressions like (-x) + y
,
which is pretty-printed as -x + y
, assuming unary minus has the same fixity as +
(and both
the operators are left-associative). I.e. unary minus is handled just like the binary one:
(0 - x) + y
is pretty-printed as 0 - x + y
.
Postfix operators are handled similarly. E.g. if !
is left-associative, then (x!)!
is
pretty-printed as x!!
and if it's right-associative -- (x!)!
.
The data type is parameterized, so that the user can choose precedence to be integer/fractional,
bounded/unbounded, etc (we could also allows operators to be partially or totally ordered, but
at the moment prec
is required to implement Ord
, i.e. it has to be totally ordered).
By default we go with bounded fractional precedence, see the main Text.Fixity module.
Fixity | |
|
Instances
Show prec ⇒ Show (FixityOver prec) Source # | |
Defined in Text.Fixity.Internal | |
Eq prec ⇒ Eq (FixityOver prec) Source # | |
Defined in Text.Fixity.Internal (==) ∷ FixityOver prec → FixityOver prec → Bool Source # (/=) ∷ FixityOver prec → FixityOver prec → Bool Source # |
type Fixity = FixityOver Precedence Source #
FixityOver
instantiated at Precedence
.
Direction in which pretty-printing goes. For example in x + y
x
is pretty-printed to the
left of +
and y
is pretty-printed to the right of +
.
data RenderContextOver prec Source #
A context that an expression is being rendered in.
Instances
HasRenderContext RenderContext Source # | |
Defined in Text.PrettyBy.Fixity | |
Show prec ⇒ Show (RenderContextOver prec) Source # | |
Defined in Text.Fixity.Internal | |
Eq prec ⇒ Eq (RenderContextOver prec) Source # | |
Defined in Text.Fixity.Internal (==) ∷ RenderContextOver prec → RenderContextOver prec → Bool Source # (/=) ∷ RenderContextOver prec → RenderContextOver prec → Bool Source # |
type RenderContext = RenderContextOver Precedence Source #
FixityOver
instantiated at Precedence
.
∷ Ord prec | |
⇒ (a → a) | Enclose a value of type |
→ RenderContextOver prec | An outer context. |
→ FixityOver prec | An inner fixity. |
→ a | |
→ a |
Enclose an a
(using the provided function) if required or leave it as is.
The need for enclosing is determined from an outer RenderContext
and the inner fixity.
A fixity with the lowest precedence. When used as a part of an outer context, never causes addition of parens.
The fixity of juxtaposition.
The fixity of a unitary expression which is safe to render without parens in any context.
A fixity with the highest precedence. When used as a part of an outer context, always causes addition of parens.
botRenderContext ∷ RenderContext Source #
An initial RenderContext
.
An expression printed in this context never gets enclosed in parens.
topRenderContext ∷ RenderContext Source #
An initial RenderContext
.
An expression printed in this context always gets enclosed in parens.