From 4890c9c4a2eef5ca100e8fd913e709c19c6b17db Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Thu, 23 Oct 2014 03:09:02 +0200 Subject: [PATCH 1/1] lambda --- lambda.hs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lambda.hs diff --git a/lambda.hs b/lambda.hs new file mode 100644 index 0000000..356412d --- /dev/null +++ b/lambda.hs @@ -0,0 +1,41 @@ +import Data.Text as T +import Data.Attoparsec.Text +import Control.Applicative + +data Term = Var String | Lambda Term Term | App Term Term + +instance Show Term where + show (Var x) = x + show (Lambda (Var x) t) = "\\" ++ x ++ "." ++ show t + show (App t r) = "(" ++ show t ++ " " ++ show r ++ ")" + +--instance Read Term where +tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of + (Right t) -> t + (Left e) -> error e + +parseVar :: Parser Term +parseVar = do + x <- many1 letter + return $! Var x + +parseLambda :: Parser Term +parseLambda = do + char '\\' + x <- parseVar + char '.' + t <- parseTerm + return $! Lambda x t + + +parseApp :: Parser Term +parseApp = do + char '(' + t <- parseTerm + char ' ' + r <- parseTerm + char '(' + return $! App t r + +parseTerm :: Parser Term +parseTerm = parseVar <|> parseLambda <|> parseApp -- 2.4.2