lambda-calculator 0.5.0 → 1.0.0
raw patch · 3 files changed
+36/−1 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Language.Lambda.Eval: etaConvert :: Eq n => LambdaExpr n -> LambdaExpr n
Files
- lambda-calculator.cabal +1/−1
- src/Language/Lambda/Eval.hs +13/−0
- test/Language/Lambda/EvalSpec.hs +22/−0
lambda-calculator.cabal view
@@ -1,5 +1,5 @@ name: lambda-calculator-version: 0.5.0+version: 1.0.0 synopsis: A lambda calculus interpreter description: Please see README.md homepage: https://github.com/sgillespie/lambda-calculus#readme
src/Language/Lambda/Eval.hs view
@@ -25,6 +25,19 @@ where uniq = fromMaybe name (find (`notElem` freeVars) uniqs) alphaConvert _ _ e = e +etaConvert :: Eq n => LambdaExpr n -> LambdaExpr n+etaConvert (Abs n (App e1 (Var n')))+ | n == n' = etaConvert e1+ | otherwise = Abs n (App (etaConvert e1) (Var n'))+etaConvert (Abs n e@(Abs _ _)) + -- If `etaConvert e == e` then etaConverting it will create an infinite loop+ | e == e' = Abs n e'+ | otherwise = etaConvert (Abs n e')+ where e' = etaConvert e+etaConvert (Abs n expr) = Abs n (etaConvert expr)+etaConvert (App e1 e2) = App (etaConvert e1) (etaConvert e2)+etaConvert expr@(Var _) = expr+ sub :: Eq n => n -> LambdaExpr n -> LambdaExpr n -> LambdaExpr n sub name b@(Var name') expr | name == name' = expr
test/Language/Lambda/EvalSpec.hs view
@@ -74,6 +74,28 @@ uniques = ["x", "y"] alphaConvert uniques freeVars expr `shouldBe` Abs "y" (Var "y") + describe "etaConvert" $ do+ it "eta converts simple expressions" $ do+ let expr = Abs "x" $ App (Var "f") (Var "x")+ etaConvert expr `shouldBe` Var "f" ++ it "eta converts nested applications" $ do+ let expr = Abs "y" $ App (App (Var "f") (Var "x")) (Var "y")+ etaConvert expr `shouldBe` App (Var "f") (Var "x")++ let expr' = Abs "x" $ Abs "y" (App (App (Var "f") (Var "x")) (Var "y"))+ etaConvert expr' `shouldBe` Var "f" ++ let expr'' = Abs "x" (Abs "y" (App (Var "y") (Var "x")))+ etaConvert expr'' `shouldBe` expr''++ let expr''' = Abs "f" (Abs "x" (Var "x"))+ etaConvert expr''' `shouldBe` expr'''++ it "ignores non-eta convertable expressions" $ do+ let expr = Abs "x" $ Var "x"+ etaConvert expr `shouldBe` expr+ describe "freeVarsOf" $ do it "Returns simple vars" $ do freeVarsOf (Var "x") `shouldBe` ["x"]