| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
Language.PTS.Pretty
Description
TODO The syntax is quite light, so the precedence table is small:
| operation | assoc | examples | 
|---|---|---|
| application | left |  f x y, f (g x)                    | 
| Pi,arrow | right |  a -> b -> c, (a -> b) -> c        | 
| lambda | none |  λx → x                           | 
| annotation | right |  a : t, a : t : s, (a : t) : t'  | 
%>>> let pp = prettyPut :: Term LambdaStar -> IO () %>>> let pp' = prettyPut :: Value LambdaStar -> IO () %>>> let s = LambdaStar
%>>> pp $ "f" @ "x" @ "y"
 f x y
%>>> pp $ pi_ "m" (Nat ~> sort_ s) s ("m" @@ "zero" ~> "x") s ∏m : Nat → ⋆. m zero → x
%>>> pp' $ lam_ "x" "x" λx → x
%>>> prettyPut ("x" -:- "t" -:- "s" :: Term LambdaStar) x : t : s
%>>> prettyPut (("x" -:- "t") -:- "s" :: Term LambdaStar) (x : t) : s
Note: we don't rename or disambiguate variables (in pretty-printing), so one have to be careful:
%>>> let latter = lams_ ["x", "x"] "x" :: Value LambdaStar
 %>>> let former = lams_ ["f", "x"] ("f" valueApp "x") valueApp lams_ ["y", "x"] "y" :: Value LambdaStar
%>>> pp' latter λx x → x
%>>> pp' former λx x → x
but they are different:
%>>> print latter >> print former ValueLam "x" (Scope (ValueLam "x" (Scope (ValueCoerce (ValueVar (B "x")))))) ValueLam "x" (Scope (ValueLam "x" (Scope (ValueCoerce (ValueVar (F (B "x")))))))
Synopsis
- class PrettyPrec a where
 - data PrettyM a
 - type Doc = Doc ()
 - ppp0 :: PrettyPrec a => a -> PrettyM Doc
 - pppParens :: Bool -> PrettyM Doc -> PrettyM Doc
 - class PrettyPrec1 f where
 - ppp1 :: (PrettyPrec1 f, PrettyPrec a) => Prec -> f a -> PrettyM Doc
 - prettyShow :: PrettyPrec a => a -> String
 - prettyShowWith :: PrettyPrec a => Options () String -> a -> String
 - prettyPut :: PrettyPrec a => a -> IO ()
 - prettyPutWith :: PrettyPrec a => Options () String -> a -> IO ()
 - pppMarkSym :: Sym -> PrettyM Doc
 - pppFreshSym :: Sym -> PrettyM Doc
 - pppScopedSym :: Sym -> (Doc -> PrettyM a) -> PrettyM a
 - pppScopedIrrSym :: IrrSym -> (Doc -> PrettyM a) -> PrettyM a
 - pppChar :: Char -> PrettyM Doc
 - pppText :: String -> PrettyM Doc
 - pppIntegral :: Integral a => a -> PrettyM Doc
 - pppIntegralSub :: Integral a => a -> PrettyM Doc
 - (<+>) :: PrettyM Doc -> PrettyM Doc -> PrettyM Doc
 - (</>) :: PrettyM Doc -> PrettyM Doc -> PrettyM Doc
 - ($$$) :: PrettyM Doc -> PrettyM Doc -> PrettyM Doc
 - pppHsepPunctuated :: Doc -> [PrettyM Doc] -> PrettyM Doc
 - pppSepPunctuated :: Doc -> [PrettyM Doc] -> PrettyM Doc
 - pppCatPunctuated :: Doc -> [PrettyM Doc] -> PrettyM Doc
 - pppColon :: PrettyM Doc
 - pppComma_ :: Doc ()
 - pppHang :: Int -> PrettyM Doc -> PrettyM Doc -> PrettyM Doc
 - pppApplication :: Prec -> PrettyM Doc -> [PrettyM Doc] -> PrettyM Doc
 - pppPi :: Prec -> [PPPi] -> PrettyM Doc -> PrettyM Doc
 - data PPPi
 - pppLambda :: Prec -> [Doc] -> PrettyM Doc -> PrettyM Doc
 - pppAnnotation :: Prec -> PrettyM Doc -> PrettyM Doc -> PrettyM Doc
 - pppAnnotationPi :: Prec -> PrettyM Doc -> [PPPi] -> PrettyM Doc -> PrettyM Doc
 - pppHadron :: Set Sym -> PrettyM Doc
 - pppQuark :: Sym -> PrettyM Doc
 - pppQuarkElim :: Prec -> IrrSym -> (Doc -> PrettyM Doc) -> Map Sym (PrettyM Doc) -> PrettyM Doc -> PrettyM Doc
 - data Prec
- = PrecDef
 - | PrecAnn
 - | PrecLambda
 - | PrecPi
 - | PrecApp
 
 - predPrec :: Prec -> Prec
 
Class
class PrettyPrec a where Source #
Minimal complete definition
Instances
A pretty-printing monad, keeping state of binded symbols.
Instances
| Monad PrettyM Source # | |
| Functor PrettyM Source # | |
| Applicative PrettyM Source # | |
Defined in Language.PTS.Pretty  | |
| a ~ Doc => IsString (PrettyM a) Source # | |
Defined in Language.PTS.Pretty Methods fromString :: String -> PrettyM a Source #  | |
| a ~ Doc => Semigroup (PrettyM a) Source # | |
| a ~ Doc => Monoid (PrettyM a) Source # | |
| a ~ Doc => PrettyPrec (PrettyM a) Source # | |
class PrettyPrec1 f where Source #
Minimal complete definition
Instances
| PrettyPrec1 Maybe Source # | |
| PrettyPrec a => PrettyPrec1 (Var a) Source # | |
| PrettyPrec1 t => PrettyPrec1 (UTerm t) Source # | |
| Specification s => PrettyPrec1 (TermChk s) Source # | |
| Specification s => PrettyPrec1 (TermInf s) Source # | |
| (Specification s, PrettyPrec err) => PrettyPrec1 (ValueElim err s) Source # | |
| (Specification s, PrettyPrec err) => PrettyPrec1 (ValueIntro err s) Source # | |
ppp1 :: (PrettyPrec1 f, PrettyPrec a) => Prec -> f a -> PrettyM Doc Source #
Helper useful to define PrettyPrec in terms of PrettyPrec1.
Convience functons
prettyShow :: PrettyPrec a => a -> String Source #
prettyShowWith :: PrettyPrec a => Options () String -> a -> String Source #
prettyPut :: PrettyPrec a => a -> IO () Source #
prettyPutWith :: PrettyPrec a => Options () String -> a -> IO () Source #
Symbols
pppMarkSym :: Sym -> PrettyM Doc Source #
Mark symbol name as used, but print it as is
>>>prettyPut' $ pppMarkSym "x" <+> pppMarkSym "x" <+> pppFreshSym "x"x x x₁
pppFreshSym :: Sym -> PrettyM Doc Source #
Generate fresh name.
>>>prettyPut' $ pppFreshSym "x" <+> pppFreshSym "x" <+> pppFreshSym "x"x x₁ x₂
pppScopedSym :: Sym -> (Doc -> PrettyM a) -> PrettyM a Source #
Scoped name usage. See 'PrettyPrec
>>>prettyPut $ pppFreshSym "x" <+> pppParens True (pppScopedSym "x" (\x -> "\\" <> return x <> "...")) <+> pppFreshSym "x"x (\x₁...) x₁
Combinators
The pretty-compact combinators wrapped in PrettyM.
Syntax
Combinators for different syntactical constructs.
pppApplication :: Prec -> PrettyM Doc -> [PrettyM Doc] -> PrettyM Doc Source #
Render application.
>>>prettyPut' $ pppApplication PrecDef "f" ["a", "b", "c", "d"]f a b c d
>>>prettyPut' $ pppApplication PrecDef "f" ["aaaa", "bbbb", "cccc", "dddd"]f aaaa bbbb cccc dddd
pppPi :: Prec -> [PPPi] -> PrettyM Doc -> PrettyM Doc Source #
Render (dependent) function space.
>>>prettyPut' $ pppPi PrecDef [PPPi "n" "Nat"] "Vec a n"∏ (n : Nat) → Vec a n
>>>prettyPut' $ pppPi PrecDef [PPPi "n" "Nat", PPForall "a"] "Vec a n"∏ (n : Nat) → ∀ a → Vec a n
>>>prettyPut' $ pppPi PrecDef [PPPi "n" "Nat", PPForall "a", PPArrow "Vec a n"] "r"∏ (n : Nat) → ∀ a → Vec a n → r
>>>prettyPut' $ pppPi PrecDef [PPArrow (pppPi PrecPi [PPArrow "a"] "b"), PPArrow "a"] "b"(a → b) → a → b
Specifies how to print (function) types.
pppLambda :: Prec -> [Doc] -> PrettyM Doc -> PrettyM Doc Source #
Render lambda abstraction.
>>>prettyPut' $ pppLambda PrecDef [] "x"x
>>>prettyPut' $ pppLambda PrecDef ["x", "y", "z"] "long body"λ x y z → long body
pppAnnotationPi :: Prec -> PrettyM Doc -> [PPPi] -> PrettyM Doc -> PrettyM Doc Source #
Render type annotation with (possibly) pi-type.
>>>prettyPut' $ pppAnnotationPi PrecDef "x" [] "t"x : t
>>>prettyPut' $ pppAnnotationPi PrecDef "f" [PPArrow (pppPi PrecPi [PPArrow "a"] "b"), PPArrow "a"] "b"f : (a → b) → a → b
>>>prettyPut' $ pppAnnotationPi PrecDef "myfunc" [PPPi "n" "Nat", PPForall "a", PPArrow "Vec a n"] "r"myfunc : ∏ (n : Nat) → ∀ a → Vec a n → r
Hadron
pppQuarkElim :: Prec -> IrrSym -> (Doc -> PrettyM Doc) -> Map Sym (PrettyM Doc) -> PrettyM Doc -> PrettyM Doc Source #