+module Lambda where
+
import Data.Text as T
import Data.Attoparsec.Text
import Control.Applicative
-data Term = Var String | Lambda Term Term | App Term Term
+type VarName = String
+data Term = Var VarName | Lambda VarName Term | App Term Term
instance Show Term where
show (Var x) = x
- show (Lambda (Var x) t) = "\\" ++ x ++ "." ++ show t
+ show (Lambda x t) = "\\" ++ x ++ "." ++ show t
show (App t r) = "(" ++ show t ++ " " ++ show r ++ ")"
--instance Read Term where
+tRead :: String -> Term
tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of
(Right t) -> t
(Left e) -> error e
parseLambda :: Parser Term
parseLambda = do
char '\\'
- x <- parseVar
+ (Var x) <- parseVar
char '.'
t <- parseTerm
return $! Lambda x t
-
parseApp :: Parser Term
parseApp = do
char '('