У меня этот язык AST
data ExprF r = Const Int
| Var String
| Lambda String r
| EList [r]
| Apply r r
deriving ( Show, Eq, Ord, Functor, Foldable )
И я хочу преобразовать его в строку
toString = cata $ \case
Const x -> show x
Var x -> x
EList x -> unwords x
Lambda x y -> unwords [x, "=>", y]
Apply x y -> unwords [x, "(", y, ")"]
Но когда в Apply
используется лямбда, мне нужны круглые скобки
(x => x)(1)
но я не могу сопоставить внутреннюю структуру с ката
toString :: Fix ExprF -> String
toString = cata $ \case
Const x -> show x
Var x -> x
Lambda x y -> unwords [x, "=>", y]
Apply (Lambda{}) y -> unwords ["(", x, ")", "(", y, ")"]
Apply x y -> unwords [x, "(", y, ")"]
Есть ли лучшее решение, чем para
?
toString2 :: Fix ExprF -> String
toString2 = para $ \case
Const x -> show x
Var x -> x
Lambda x (_,y) -> unwords [x, "=>", y]
EList x -> unwords (snd <$> x)
Apply ((Fix Lambda {}),x) (_,y) -> unwords ["(", x, ")", "(", y, ")"]
Apply (_,x) (_,y) -> unwords [x, "(", y, ")"]
Выглядит уродливее. Даже если это нужно только в одном месте, мне нужно удалить параметры кортежа fst везде, и я думаю, это будет медленнее.
showsPrec
. Хотя мне Para не так уж и плохо. - person chi   schedule 23.08.2016para
в порядке, но когда аст намного больше, это просто слишком много шума. - person ais   schedule 23.08.2016Bool
рекурсивному вызову, свернув функциюBool -> a
. Заключительные примечания Киселева без тегов касаются этого. - person Benjamin Hodgson♦   schedule 23.08.2016cata $ \case Var x -> const x ; Apply x y -> \_ -> unwords [x 5, y 5] ; Lambda x y -> (\p -> if p==5 then addParen (x 0) (y 0) else noParen (x 0) (y 0) ; ...
Отрегулируйте номера приоритета по мере необходимости и передайте начальный 0 на верхнем уровне, чтобы результат был строкой. - person chi   schedule 23.08.2016showsPrec
. - person Daniel Wagner   schedule 23.08.2016Int
,Bool
не должно быть достаточно? - person ais   schedule 23.08.2016Fix ExprF
, а затем использовать синонимы шаблонов для его создания / деконструирования. Синонимы шаблонов сделают его менее неудобным, а newtype сделает типы менее пугающими. - person dfeuer   schedule 23.08.2016