
On Oct 10, 2008, at 5:46 PM, Jonathan Cast wrote:
identifier = lexeme $ match "[[:lower:]_][[:alphanum:]_]*"
(pretending match :: String -> Parser String is a regex engine).
vs.
identified = lexeme $ do c <- satisfy isLower <|> satisfy (=='_') s <- many $ satisfy isAlphaNum <|> satisfy (=='_') return (c:s)
lexeme $ (:) <$> (lowerChar <|> char '_') <*> (many $ alphaNum <|> char '_') ? or (since we're not really talking about full fledged parsers that need lexemes here or such, but usually interpreting a single string, otherwise regexes will quickly become atrocious) foo (x:xs) | isLower x || x == '_', (xs', rest) <- break alphaOrUnder xs = Just (x : xs', rest) | otherwise = Nothing where alphaOrUnder = liftM2 (||) isAlphaNum (=='_') foo [] = Nothing A bit more verbose, sure, but operating on text functionally makes it really easy to reason about what your parser is actually doing, unlike the mysteries of a regex. --Sterl.