
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