summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda.hs')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda.hs18
1 files changed, 11 insertions, 7 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda.hs b/lambda-calcul/haskell/src/Minilang/Lambda.hs
index d223658..ff636ce 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda.hs
@@ -3,7 +3,7 @@ module Minilang.Lambda where
import Data.Bifunctor (second)
import Minilang.Lambda.DeBruijn (eval, eval', fromDeBruijn, toDeBruijn)
import Minilang.Lambda.Eval (Env, Term)
-import Minilang.Lambda.Infer (Context, TypeError, infer)
+import Minilang.Lambda.Infer (Context, TypeError, extendContext, infer)
import Minilang.Lambda.Parser (AST (..), desugar)
import Minilang.Lambda.Unify (Type (..))
import Minilang.REPL.Types (Language (..))
@@ -38,24 +38,28 @@ loadProgram language env context exprs =
exprs
runExpr language (Def ident body) env context =
- let term = desugar body
+ let term = evalInEnv env body
in case language of
Typed ->
case infer term of
Left typeError -> Left typeError
Right typ ->
- Right (Nothing, (ident, term) : env, context)
+ Right (Nothing, (ident, term) : env, extendContext ident typ context)
Untyped ->
Right (Nothing, (ident, term) : env, context)
runExpr language expr env context =
- let term = desugar expr
- env' = second toDeBruijn <$> env
- v = fromDeBruijn $ eval' env' (toDeBruijn term)
+ let v = evalInEnv env expr
in case language of
Typed ->
- case infer term of
+ case infer v of
Left typeError -> Left typeError
Right typ ->
Right (Just (v, typ), env, context)
Untyped ->
Right (Just (v, TyVar "<?>"), env, context)
+
+evalInEnv :: Env -> AST -> Term
+evalInEnv env expr =
+ let term = desugar expr
+ env' = second toDeBruijn <$> env
+ in fromDeBruijn $ eval' env' (toDeBruijn term)