Parsing expressions with combinators

I’m very new to Haskell’s ReadP library, and the entire concept of parser combinators, so I was wondering whether there are better ways to do some things in this program:

import Text.ParserCombinators.ReadP import Control.Applicative import Data.List  data Operator = Add | Subtract  instance Show Operator where     show Add = "+"     show Subtract = "-"  instance Read Operator where     readsPrec _ "+" = [(Add, "")]     readsPrec _ "-" = [(Subtract, "")]     readsPrec _ _ = []  data Expression = Number Int                 | Infix { left :: Expression, op :: Operator, right :: Expression }  instance Show Expression where     show (Number x) = show x     show (Infix left op right) = "(" ++ (show left) ++ " " ++ (show op) ++ " " ++ (show right) ++ ")"  digit :: ReadP Char digit = satisfy $   \char -> char >= '0' && char <= '9'  number :: ReadP Expression number = fmap (Number . read) (many1 digit)  operator :: ReadP Operator operator = fmap read (string "+" <|> string "-")  expression :: ReadP Expression expression = do     skipSpaces     left <- number     skipSpaces     op <- Control.Applicative.optional operator     case op of         Nothing -> return left         Just op -> do             skipSpaces             right <- expression             return (Infix left op right)  parseExpression :: String -> Maybe Expression parseExpression input = case readP_to_S expression input of     [] -> Nothing     xs -> (Just . fst . last) xs 

The main area where I’m looking for improvements is the expression function, and specifically the things which seem improvable are the repeated calls to skipSpaces and the case expression to check whether an operator was parsed, but of course if you notice anything else that would be helpful too!