[Haskell-cafe] Interesting new user perspective

Sterling Clover s.clover at gmail.com
Fri Oct 10 19:54:28 EDT 2008


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.


More information about the Haskell-Cafe mailing list