Skip to content

Instantly share code, notes, and snippets.

@googleson78
Created February 18, 2020 08:59
Show Gist options
  • Save googleson78/532453b82ce5bbcfe590beaf2eb1c834 to your computer and use it in GitHub Desktop.
Save googleson78/532453b82ce5bbcfe590beaf2eb1c834 to your computer and use it in GitHub Desktop.
data Lambda
= Var Name
| App Lambda Lambda
| Lam Name Lambda
deriving (Eq, Show)
name :: Parser Name
name = lexeme $ sat \x -> if x `elem` "xyzuvw" then Just $ Name [x] else Nothing
var :: Parser Lambda
var = Var <$> name
lambda :: Parser Lambda
lambda =
asum
[ lam
, app
, var
]
lambdaAll :: Parser Lambda
lambdaAll = lambda <* endOfInput
bracket :: Parser a -> Parser a
bracket p = some (char '(') *> p <* some (char ')')
app :: Parser Lambda
app = foldl1 App <$> do some $ var <|> lam <|> bracket app
lam :: Parser Lambda
lam = do
char '\\'
var <- name
char '.'
body <- lambda
pure $ Lam var body
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment