From fee6a0e4a342948a9651da8d8a293f52600c29fe Mon Sep 17 00:00:00 2001 From: jingus Date: Fri, 15 May 2026 19:00:37 -0500 Subject: [PATCH] basic substitution implemented --- src/Evaluation.hs | 14 +++++++++++++- test/EvaluationSpec.hs | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Evaluation.hs b/src/Evaluation.hs index 1b246fa..b5ca12f 100644 --- a/src/Evaluation.hs +++ b/src/Evaluation.hs @@ -1,6 +1,18 @@ module Evaluation where -import Parser (Expr (Variable)) +import Parser (Expr (Abstraction, Application, Variable)) + +-- | substitute all variables matching string in first expression with second expression +subst :: Expr -> String -> Expr -> Expr +subst v@(Variable vname) name content = if vname == name then content else v +subst (Abstraction vname body) name content = Abstraction vname (subst body name content) +subst (Application f arg) name content = Application (subst f name content) (subst arg name content) + +bind :: Expr -> Expr -> Either String Expr +bind (Abstraction v b) arg = Left "Unimplemented" + +beta :: Expr -> Maybe Expr +beta _ = Nothing run :: Expr -> Expr run _ = Variable "a" diff --git a/test/EvaluationSpec.hs b/test/EvaluationSpec.hs index 245eeee..f9c24fe 100644 --- a/test/EvaluationSpec.hs +++ b/test/EvaluationSpec.hs @@ -1,8 +1,19 @@ module EvaluationSpec (spec) where + +import Evaluation (subst) +import Parser (Expr (Abstraction, Application, Variable)) import Test.Hspec spec :: Spec spec = do - describe "Evaluation" $ do - it "can evaluation expressions" $ - True `shouldBe` True + describe "subst" $ do + it "cannot substitute mismatched variables" $ + subst (Variable "x") "y" (Variable "z") `shouldBe` Variable "x" + it "can substitute matched variables" $ + subst (Variable "x") "x" (Variable "z") `shouldBe` Variable "z" + it "can substitute nested variables" $ + subst absWithZ "z" absI `shouldNotBe` absWithZMaker absI + where + absWithZMaker z = Abstraction "x" (Application z (Variable "x")) + absWithZ = absWithZMaker (Variable "z") + absI = Abstraction "i" (Variable "i")