lambda
authorTomas Musil <tomik.musil@gmail.com>
Thu, 23 Oct 2014 01:09:02 +0000 (03:09 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Thu, 23 Oct 2014 01:09:02 +0000 (03:09 +0200)
lambda.hs [new file with mode: 0644]

diff --git a/lambda.hs b/lambda.hs
new file mode 100644 (file)
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