import Text.ParserCombinators.Parsec data Region = UnitCircle | Scale Int Region | Union Region Region deriving Show parseTwoArgs c x y = do char '(' a <- x char ',' b <- y char ')' return (c a b) parseRegion :: Parser Region parseRegion = do (try parseUnitCircle) <|> parseScale <|> parseUnion parseUnitCircle :: Parser Region parseUnitCircle = do string "unitcircle" return UnitCircle parseScale = parseTwoArgs Scale number parseRegion parseUnion = parseTwoArgs Union parseRegion parseRegion number :: Parser Int number = do{ ds <- many1 digit ; return (read ds) } "number"