
Hi Nathan, On Sun, Dec 16, 2012 at 05:55:53PM +0100, Nathan Hüsken wrote:
cell = many1 (noneOf ",") lastCell = many1 (noneOf "\n")
I wouldn't define the cells by the character that separates them, but by the allowed characters for a cell. Using attoparsec with applicative style (I didn't yet use parsec) I would write: import qualified Data.Attoparsec.Text as P import qualified Data.Attoparsec.Combinator as PC import qualified Data.Text as T import Data.Char (isAlpha) cell :: P.Parser T.Text cell = P.takeWhile1 isAlpha data Row { fstCell :: T.Text, sndCell :: T.Text, lastCell :: T.Text } row :: P.Parser Row row = Row <$> cell <*> (P.char ',' *> cell) <*> (P.char ',' *> cell) rows :: P.Parser [Row] rows = PC.manyTill row P.endOfLine The applicative style really shines in these cases, because the definition of the parser combines nicely with the creation of the data structures for the parsed data. Greetings, Daniel