From 91ae5eb9e16b00603c3dfa5ec123c64dd140765d Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sun, 22 Mar 2026 08:49:18 +0100 Subject: Add integers parsing --- lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs') diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs b/lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs index 025fd39..1e85ca6 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs @@ -4,12 +4,13 @@ module Minilang.Lambda.DeBruijn where import Data.List (elemIndex) import Data.Text (Text) +import qualified Data.Text import Minilang.Lambda.Eval (Term) import qualified Minilang.Lambda.Eval as Eval -import Debug.Trace (trace) data DeBruijn ann = FV Text + | FNum Int | Var ann Int | Lam ann (DeBruijn ann) | App (DeBruijn ann) (DeBruijn ann) @@ -23,6 +24,7 @@ newEnv = [] fromDeBruijn :: DeBruijn Text -> Term fromDeBruijn = \case FV x -> Eval.Var x + FNum n -> Eval.Num n Var s _ -> Eval.Var s Lam s body -> Eval.Lam s (fromDeBruijn body) App f a -> Eval.App (fromDeBruijn f) (fromDeBruijn a) @@ -39,6 +41,8 @@ toDeBruijn term = go term [] Lam x (go body (x : env)) go (Eval.App f a) env = App (go f env) (go a env) + go (Eval.Num n) _env = + FNum n eval :: DeBruijn ann -> DeBruijn ann eval (App f a) = @@ -64,6 +68,7 @@ substitute env n arg term = case term of FV x -> case lookup x env of Just term -> term Nothing -> FV x + FNum _ -> term Var t x | x == n -> arg | otherwise -> Var t x @@ -73,6 +78,13 @@ substitute env n arg term = case term of pretty :: DeBruijn Text -> Text pretty = \case FV x -> x + FNum n -> showNum n Var s _ -> s Lam s body -> "(lam (" <> s <> ") " <> pretty body <> ")" App f a -> "(" <> pretty f <> " " <> pretty a <> ")" + +-- | Render an integer, using no space between '-' and digits for negative numbers. +showNum :: Int -> Text +showNum n + | n < 0 = "-" <> Data.Text.pack (show (abs n)) + | otherwise = Data.Text.pack (show n) -- cgit v1.3.1