newtype Parser a = Parser { unParser :: MaybeT (State String) a }
deriving ( Functor, Applicative, Alternative,
Monad, MonadPlus, MonadTrans,
MonadState String )
-- why write boilerplate when the
-- compiler will for you?
runParser :: Parser a -> String -> Maybe a
runParser input = flip evalStateT input . runMaybeT
-- | Parses a single character if it passes a predicate
satisfy :: (Char -> Bool) -> Parser Char
satisfy p = do
(c:cs) <- get
guard (p c)
put cs
return c
char :: Char -> Parser Char
char c = satisfy (== c)
-- | Parses a whole string
string :: String -> Parser String
string = mapM char
-- | Converts a parser to be surrounded by parentheses
parens :: Parser a -> Parser a
parens p = char '(' *> p <* char ')'At least a basic understanding of haskell (or similar) is going to be required to appreciate it, and at that point you're obviously someone who was curious enough to have the knowledge to understand it to begin with.
Implementing a JIT Compiled Language with Haskell and LLVM (stephendiehl.com)
195 points by rwosync 53 days ago | flag | comments
https://news.ycombinator.com/item?id=7031998If it's interesting, it's interesting. If it's not worthy of being seen again, it won't be upvoted. By all means link to the previous discussion, but quit the whining.