Неопробованный псевдокод:
instance Show Formula where
showsPrec _p True = "True"
showsPrec _p False = "False"
showsPrec p (And f1 f2) = showParen (p > 5) $
showsPrec 5 f1 . (" & " ++) . showsPrec 5 f2
showsPrec p (Forall x f) = showParen (p > 8) $
("forall " ++ x ++) . showsPrec 8 f
...
(я, вероятно, должен использовать showString
вместо тех, что ++
выше. Я думаю, это должно работать в любом случае.)
Выше целое числоp
представляет приоритет контекста, в котором мы показываем текущую формулу.Например, если мы показываем f
внутри f & ...
, тогда p
будет иметь уровень приоритета &
.
Если нам нужно напечатать символ в контексте, который имеет более высокий приоритет, мынужно добавить скобки.Например, если f
равно a | b
, мы не можем написать a | b & ...
, в противном случае оно интерпретируется как a | (b & ...)
.Нам нужно поставить круглые скобки вокруг a | b
.Это делается с помощью showParen (p > ...)
.
Когда мы выполняем рекурсию, мы передаем уровень приоритета имеющегося символа в подтермы.
Выше я выбирал уровни приоритета случайным образом.Вы должны настроить их по своему вкусу.Вам также следует убедиться, что выбранные вами уровни соответствуют стандартным библиотекам.Например, печать Just someFormula
не должна генерировать такие вещи, как Just a & b
, а добавлять скобки.