是否有任何常用的方法甚至是一个库,用于对具有关联性和优先级分配的(二元)运算符的语法树进行漂亮的打印(和解析),以便结果使用尽可能少的括号? / p>
以命题演算的公式为例:
data Formula
= Atom String
| Not (Formula)
| And (Formula) (Formula)
| Or (Formula) (Formula)
| Imp (Formula) (Formula)
假设优先级为Imp
< Or
< And
< Not
(因此Not
绑定最多)And
,Or
和Imp
应该与权利相关联;例如,Imp (And (Imp (Atom "A") (Atom "B")) (Atom "A")) (Atom "B")
应该打印(A -> B) /\ A -> B
。
当然这可以通过模式匹配来实现,但这很乏味且非常不愉快;我正在寻找Coq证明助手的这种符号同样简单的东西:
Notation "A /\ B" := (and A B) (at level 80, right associativity).
生成解析器和漂亮的打印机。
答案 0 :(得分:4)
Show
的{{1}}个实例可能如下所示:
Formula
允许任何instance Show Formula where
showsPrec _ (Atom name) = showString name
showsPrec p (Not formula) = showParen (p > 3) $
showString "\\+ " . showsPrec 3 formula
showsPrec p (And lhs rhs) = showParen (p > 2) $
showsPrec 3 lhs . showString " /\\ " . showsPrec 2 rhs
showsPrec p (Or lhs rhs) = showParen (p > 1) $
showsPrec 2 lhs . showString " \\/ " . showsPrec 1 rhs
showsPrec p (Imp lhs rhs) = showParen (p > 0) $
showsPrec 1 lhs . showString " -> " . showsPrec 0 rhs
Formula
n适当的parens:
show
打印(main = print $ Imp (And (Imp (Atom "A") (Atom "B")) (Atom "A")) (Atom "B")
为print
):
putStrLn . show