diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 22:24:04 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 22:24:04 +0200 |
| commit | 2488429444c2740a075a1f13217ca1838f11026f (patch) | |
| tree | 5394b1052eb91c2b08e92201288378815da789e1 /lambda-calcul/haskell/src/Minilang/Lambda | |
| parent | 794003e6c0684e04dcde24abe86a490b32342d27 (diff) | |
| download | lambda-nantes-2488429444c2740a075a1f13217ca1838f11026f.tar.gz | |
feat: can desugar expressions
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs index 28da47f..37834d3 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs @@ -11,6 +11,8 @@ import Data.Void (Void) import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, manyTill, notFollowedBy, optional, parse, try) import Text.Megaparsec.Char (alphaNumChar, char, letterChar, space1, string, symbolChar) import qualified Text.Megaparsec.Char.Lexer as L +import Minilang.Lambda.Eval (Term) +import qualified Minilang.Lambda.Eval as Eval type Parser = Parsec Void Text @@ -20,6 +22,20 @@ data ParseError = ParseError Text data AST = Sym Text | Abs [Text] AST | App AST AST [AST] deriving (Eq, Show) +desugar :: AST -> Term +desugar = \case + Sym sym -> Eval.Var sym + Abs bound body -> + foldr + Eval.Lam + (desugar body) + bound + App x y rest -> + foldl + (\acc a -> Eval.App acc (desugar a)) + (Eval.App (desugar x) (desugar y)) + rest + pretty :: AST -> Text pretty = \case Sym sym -> sym |
