Skip to content

Instantly share code, notes, and snippets.

@SAdams601
Created February 20, 2014 15:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SAdams601/6497d91ea344c0521f87 to your computer and use it in GitHub Desktop.
Save SAdams601/6497d91ea344c0521f87 to your computer and use it in GitHub Desktop.
The State monad parse
type ParseState = State String
parse :: String -> ParseState Expr
parse (ch:chs)
| isAlpha(ch) = do
put chs
return (Var ch)
| isDigit(ch) = do
put chs
return (N (fromEnum ch - fromEnum '0'))
| ch == '(' = do
e1 <- parse(chs)
rest1 <- get
let (op:rest2) = rest1
e2 <- parse(rest2)
rest3 <- get
let (')':restFinal) = rest3
put restFinal
return $ apply op e1 e2
| ch =='<' = do
let (v:':':rest) = chs
e <- parse(rest)
restFinal <- get
put restFinal
return (Assign v e)
where apply '+' = Add
apply '-' = Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment