diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-28 20:14:16 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-28 20:14:16 +0100 |
| commit | 1d1f0efc7de1eaa0c8a6b503892c2f950008fde6 (patch) | |
| tree | bd2e2ea5963d8a208d302854502f580d8ffd73cb /lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs | |
| parent | a210419fd60c00d011f70fb1b968031621e4c01a (diff) | |
| download | lambda-nantes-1d1f0efc7de1eaa0c8a6b503892c2f950008fde6.tar.gz | |
wip: port REPL from minilang
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs | 36 |
1 files changed, 7 insertions, 29 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs index cbbdc51..58f8ba6 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs @@ -9,36 +9,14 @@ data Term | App Term Term deriving (Show, Read, Eq) -type Env = [(Text, Value)] +type Env = [(Text, Term)] -data Value - = V Text - | Abs Text Term Env -- a closure, ie. lambda with its captured environment - | Ap Value Value - deriving (Show, Read, Eq) +newEnv :: Env +newEnv = [] -- call-by-value evaluator -eval :: Term -> Env -> Value -eval (Var x) env = case lookup x env of - Just v -> v -- we do not need to eval v again - Nothing -> V x -- x is not bound in env -eval (Lam x body) env = Abs x body env -eval (App f a) env = - -- we need to force evaluation of the argument - -- because haskell's default semantics is non-strict - -- so if a' is never used, it will not be evaluated! - let a' = eval a env - in seq a' $ case eval f env of - Abs x body env' -> eval body ((x, a') : env') - f' -> Ap f' a' +eval :: Term -> Env -> Term +eval = undefined -evalNeed :: Term -> Env -> Value -evalNeed (Var x) env = case lookup x env of - Just v -> v - Nothing -> V x -evalNeed (Lam x body) env = Abs x body env -evalNeed (App f a) env = - let a' = eval a env - in case evalNeed f env of - Abs x body env' -> evalNeed body ((x, a') : env') - f' -> Ap f' a' +evalNeed :: Term -> Env -> Term +evalNeed = undefined |
