--- /dev/null
+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