356412d880a056400fe68c744b2ad09dbf30fbb7
[fp.git] / lambda.hs
1 import Data.Text as T
2 import Data.Attoparsec.Text
3 import Control.Applicative
4
5 data Term = Var String | Lambda Term Term | App Term Term
6
7 instance Show Term where
8   show (Var x) = x
9   show (Lambda (Var x) t) = "\\" ++ x ++ "." ++ show t
10   show (App t r) = "(" ++ show t ++ " " ++ show r ++ ")"
11
12 --instance Read Term where
13 tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of
14     (Right t) -> t
15     (Left e) -> error e
16
17 parseVar :: Parser Term
18 parseVar = do
19   x <- many1 letter
20   return $! Var x
21
22 parseLambda :: Parser Term
23 parseLambda = do
24   char '\\'
25   x <- parseVar
26   char '.'
27   t <- parseTerm
28   return $! Lambda x t
29
30
31 parseApp :: Parser Term
32 parseApp = do
33   char '('
34   t <- parseTerm
35   char ' '
36   r <- parseTerm
37   char '('
38   return $! App t r
39
40 parseTerm :: Parser Term
41 parseTerm = parseVar <|> parseLambda <|> parseApp