pretty- Pretty-printing library





John Hughes's and Simon Peyton Jones's Pretty Printer Combinators

Based on The Design of a Pretty-printing Library in Advanced Functional Programming, Johan Jeuring and Erik Meijer (eds), LNCS 925

Heavily modified by Simon Peyton Jones, Dec 96


The document type

data Doc Source

The abstract type of documents. The Show instance is equivalent to using render.


Constructing documents

Converting values into documents

char :: Char -> DocSource

A document of height and width 1, containing a literal character.

text :: String -> DocSource

A document of height 1 containing a literal string. text satisfies the following laws:

The side condition on the last law is necessary because text "" has height 1, while empty has no height.

ptext :: String -> DocSource

An obsolete function, now identical to text.

zeroWidthText :: String -> DocSource

Some text, but without any width. Use for non-printing text such as a HTML or Latex tags

int :: Int -> DocSource

int n = text (show n)

integer :: Integer -> DocSource

integer n = text (show n)

float :: Float -> DocSource

float n = text (show n)

double :: Double -> DocSource

double n = text (show n)

rational :: Rational -> DocSource

rational n = text (show n)

Simple derived documents

semi :: DocSource

A ';' character

comma :: DocSource

A ',' character

colon :: DocSource

A : character

space :: DocSource

A space character

equals :: DocSource

A '=' character

lparen :: DocSource

A '(' character

rparen :: DocSource

A ')' character

lbrack :: DocSource

A '[' character

rbrack :: DocSource

A ']' character

lbrace :: DocSource

A '{' character

rbrace :: DocSource

A '}' character

Wrapping documents in delimiters

parens :: Doc -> DocSource

Wrap document in (...)

brackets :: Doc -> DocSource

Wrap document in [...]

braces :: Doc -> DocSource

Wrap document in {...}

quotes :: Doc -> DocSource

Wrap document in '...'

doubleQuotes :: Doc -> DocSource

Wrap document in "..."

Combining documents

empty :: DocSource

The empty document, with no height and no width. empty is the identity for <>, <+>, $$ and $+$, and anywhere in the argument list for sep, hcat, hsep, vcat, fcat etc.

(<>) :: Doc -> Doc -> DocSource

Beside. <> is associative, with identity empty.

(<+>) :: Doc -> Doc -> DocSource

Beside, separated by space, unless one of the arguments is empty. <+> is associative, with identity empty.

hcat :: [Doc] -> DocSource

List version of <>.

hsep :: [Doc] -> DocSource

List version of <+>.

($$) :: Doc -> Doc -> DocSource

Above, except that if the last line of the first argument stops at least one position before the first line of the second begins, these two lines are overlapped. For example:

    text "hi" $$ nest 5 (text "there")

lays out as

    hi   there

rather than


$$ is associative, with identity empty, and also satisfies

  • (x $$ y) <> z = x $$ (y <> z), if y non-empty.

($+$) :: Doc -> Doc -> DocSource

Above, with no overlapping. $+$ is associative, with identity empty.

vcat :: [Doc] -> DocSource

List version of $$.

sep :: [Doc] -> DocSource

Either hsep or vcat.

cat :: [Doc] -> DocSource

Either hcat or vcat.

fsep :: [Doc] -> DocSource

"Paragraph fill" version of sep.

fcat :: [Doc] -> DocSource

"Paragraph fill" version of cat.

nest :: Int -> Doc -> DocSource

Nest (or indent) a document by a given number of positions (which may also be negative). nest satisfies the laws:

The side condition on the last law is needed because empty is a left identity for <>.

hang :: Doc -> Int -> Doc -> DocSource

hang d1 n d2 = sep [d1, nest n d2]

punctuate :: Doc -> [Doc] -> [Doc]Source

punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]

Predicates on documents

isEmpty :: Doc -> BoolSource

Returns True if the document is empty

Rendering documents

Default rendering

render :: Doc -> StringSource

Renders the document as a string using the default style.

Rendering with a particular style

data Style Source

A rendering style.




mode :: Mode

The rendering mode

lineLength :: Int

Length of line, in chars

ribbonsPerLine :: Float

Ratio of ribbon length to line length

style :: StyleSource

The default style (mode=PageMode, lineLength=100, ribbonsPerLine=1.5).

renderStyle :: Style -> Doc -> StringSource

Render the document as a string using a specified style.

General rendering



:: Mode

Rendering mode

-> Int

Line length

-> Float

Ribbons per line

-> (TextDetails -> a -> a)

What to do with text

-> a

What to do at the end

-> Doc

The document

-> a


The general rendering interface.

data Mode Source

Rendering mode.





With zig-zag cuts


No indentation, infinitely long lines


All on one line