From: Tomas Musil Date: Wed, 3 Dec 2014 15:15:42 +0000 (+0100) Subject: multiple applications X-Git-Url: http://git.tomasm.cz/fp.git/commitdiff_plain/494e6afee1f1c583a880fca4e1f234de6823271a?ds=inline;hp=e9fefc72cffd266f05269f87992606365f8bd57a multiple applications --- diff --git a/Arithmetic.lc b/Arithmetic.lc index 5a30a17..6851970 100644 --- a/Arithmetic.lc +++ b/Arithmetic.lc @@ -1,12 +1,12 @@ import Logic -Succ=\n.\f.\x.(f ((n f) x)) -Zero=\f.\x.x +Succ=\n f x.(f ((n f) x)) +Zero=\f x.x One=(Succ Zero) Two=(Succ One) Three=(Succ Two) -Add=\n.\m.\f.\x.((n f) ((m f) x)) -Mult=\n.\m.\f.(n (m f)) -IsZero=\n.\x.\y.((n \z.y) x) +Add=\n m f x.((n f) ((m f) x)) +Mult=\n m f.(n (m f)) +IsZero=\n x y.((n \z.y) x) ((Add Two) Three) ((Mult Two) Three) (PrintBool (IsZero Zero)) diff --git a/Logic.lc b/Logic.lc index 27b52fc..8193a34 100644 --- a/Logic.lc +++ b/Logic.lc @@ -1,5 +1,5 @@ -True=\x.\y.x -False=\x.\y.y -And=\a.\b.((a b) False) +True=\x y.x +False=\x y.y +And=\a b.((a b) False) If=\x.x PrintBool=\x.(((If x) TRUE) FALSE) diff --git a/src/Lambda.hs b/src/Lambda.hs index f9fbe2b..54c4065 100644 --- a/src/Lambda.hs +++ b/src/Lambda.hs @@ -28,7 +28,7 @@ parseVar = do parseLambda :: Parser Term parseLambda = do char '\\' - vars <- many1 (parseVar <* char ' ') + vars <- sepBy1 parseVar (char ' ') char '.' t <- parseTerm return $! createLambda vars t @@ -40,15 +40,26 @@ createLambda _ _ = error "createLambda failed" parseApp :: Parser Term parseApp = do + aps <- sepBy1 (parseBraces <|> parseLambda <|> parseVar) (char ' ') + return $! createApp aps + +createApp :: [Term] -> Term +createApp [t] = t +createApp (t:ts:tss) = createApp (App t ts : tss) +createApp [] = error "empty createApp" + +parseBraces :: Parser Term +parseBraces = do char '(' t <- parseTerm - char ' ' - r <- parseTerm char ')' - return $! App t r + return t parseTerm :: Parser Term -parseTerm = parseVar <|> parseLambda <|> parseApp +parseTerm = parseApp <|> + parseBraces <|> + parseLambda <|> + parseVar -------------------------------------------------