summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2025-10-28 18:34:16 +0100
committerArnaud Bailly <arnaud@pankzsoft.com>2025-10-28 18:48:27 +0100
commita210419fd60c00d011f70fb1b968031621e4c01a (patch)
tree68e7f8891970c230a63755e7714bb6f66f00a99d /lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
parent1c4a175e00e727ac4987f60503bd7dbaeb3f26ad (diff)
downloadlambda-nantes-a210419fd60c00d011f70fb1b968031621e4c01a.tar.gz
Provide function to go back from a deBruijn term to an AST
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs14
1 files changed, 14 insertions, 0 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
index e52c981..fd02ebe 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
@@ -37,6 +37,20 @@ desugar = \case
(Eval.App (desugar x) (desugar y))
rest
+resugar :: Term -> AST
+resugar = \case
+ Eval.Var s -> Sym s
+ Eval.Lam x body -> case resugar body of
+ Abs vars ast -> Abs (x : vars) ast
+ other -> Abs [x] other
+ Eval.App l r -> case resugar l of
+ App f a rest -> App f a (rest ++ [r'])
+ where
+ r' = resugar r
+ other -> App other r' []
+ where
+ r' = resugar r
+
pretty :: AST -> Text
pretty = \case
Sym symb -> symb