Hi Haskellers, I'm asking some advice on a small piece of code representing a simplified version of a treatment I need to perform. I have a line-oriented string/file, from which I want to extract only a substring of those lines starting with char '+' (the detail of the extraction is irrelevant here, I'll just return what follows the '+'). [I also simplified the "eol" parser for shorter code.] I came out with the code below. The line parser returns a "Maybe String". The complete parser return a "[Maybe String]" by mere concatenation. The main function filters the 'Nothing' with 'catMaybes'. > import Text.ParserCombinators.Parsec > import Data.Maybe > > maybePlusFile :: GenParser Char st [Maybe String] > maybePlusFile = endBy maybePlusLine eol > > maybePlusLine :: GenParser Char st (Maybe String) > maybePlusLine = try (do char('+') > result <- many (noneOf "\n") > return $ Just result) > <|> do many (noneOf "\n") > return $ Nothing > > eol = char '\n' > > selectPlus :: String -> Either ParseError [String] > selectPlus input = > case parse maybePlusFile "(input)" input of > Left e -> Left e > Right mblist -> Right $ catMaybes mblist This works as expected (or so it seems), as the ghci dump shows: > GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help > ... > Prelude> :l selectPlus.hs > [1 of 1] Compiling Main ( selectPlus.hs, interpreted ) > Ok, modules loaded: Main. > *Main> selectPlus "abc\n+123\ndef\n+456\n" > Loading package parsec-2.1.0.1 ... linking ... done. > Right ["123","456"] > *Main>
I'd like to know if this code is good style, and how you would possibly improve it. Thanks in advance. --Serge
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe