summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs9
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