summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2026-03-22 08:49:18 +0100
committerArnaud Bailly <arnaud@pankzsoft.com>2026-03-22 08:49:18 +0100
commit91ae5eb9e16b00603c3dfa5ec123c64dd140765d (patch)
tree3692a8f997f169e904c13e11b9e2794b8dfce594 /lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs
parentfade9c496cebbc0caa97821cb85e9e56da31c57f (diff)
downloadlambda-nantes-91ae5eb9e16b00603c3dfa5ec123c64dd140765d.tar.gz
Add integers parsing
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/DeBruijn.hs14
1 files changed, 13 insertions, 1 deletions
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)