diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2026-03-22 08:49:18 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2026-03-22 08:49:18 +0100 |
| commit | 91ae5eb9e16b00603c3dfa5ec123c64dd140765d (patch) | |
| tree | 3692a8f997f169e904c13e11b9e2794b8dfce594 /lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs | |
| parent | fade9c496cebbc0caa97821cb85e9e56da31c57f (diff) | |
| download | lambda-nantes-91ae5eb9e16b00603c3dfa5ec123c64dd140765d.tar.gz | |
Add integers parsing
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs index e5530eb..650c4bd 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs @@ -12,15 +12,16 @@ data Term = Var Text | Lam Text Term | App Term Term + | Num Int deriving (Show, Read, Eq, Generic, ToJSON, FromJSON) instance IsString Term where fromString = Var . pack -data Value = Clos EnvValue Text Term | VNeut Neutral +data Value = Clos EnvValue Text Term | VNeut Neutral | VNum Int deriving (Show, Read, Eq) -data Neutral = NVar Text | NApp Neutral Value +data Neutral = NVar Text | NNum Int | NApp Neutral Value deriving (Show, Read, Eq) type Env = [(Text, Term)] @@ -45,6 +46,7 @@ eval env = \case let f' = eval env f a' = eval env a in f' `seq` a' `seq` apply f' a' + Num n -> VNum n apply :: Value -> Value -> Value apply f a = @@ -53,6 +55,7 @@ apply f a = let env' = (x, a) : closureEnv in eval env' body VNeut f' -> VNeut (NApp f' a) + VNum n -> VNeut (NApp (NNum n) a) readBack :: Value -> Term readBack = go [] @@ -64,7 +67,9 @@ readBack = go [] val' = eval ((x, VNeut (NVar name)) : env) body in Lam name (go names' val') VNeut (NVar n) -> Var n + VNeut (NNum n) -> Num n VNeut (NApp f a) -> App (go names (VNeut f)) (go names a) + VNum n -> Num n freshName :: Text -> [Text] -> Text freshName x names |
