[Haskell-cafe] A convenient way to deal with conditional function composition?

Maxime Henrion mux at FreeBSD.org
Tue Apr 10 09:14:49 EDT 2007

	Hello all,

I have found myself writing instances of Show for some types of
mine, and I did so by defining the showsPrec function, for performance
reasons.  I ended up with code that I find quite inelegant.  Here's
an example:

data Move = Move {
                 movePiece     :: PieceType,
                 moveFile      :: Maybe File,
                 moveTarget    :: Square,
                 moveIsCapture :: Bool
                 --movePromotion :: Maybe PieceType
  deriving (Eq)

instance Show Move where
  showsPrec _
    Move {
      movePiece     = p,
      moveFile      = f,
      moveTarget    = s,
      moveIsCapture = c
    } = (if p /= Pawn then shows p else id) .
        (maybe id shows f) .
        (if c then ('x':) else id) .
        shows s

I considered writing a conditional composiion combinator to avoid all
the 'if foo then f else id' code.  Something looking like this:

f .? True  g = f . g
f .? False g = f

I'm not sure this is the best approach though, and I would be happy
to hear about your suggestions for improving the style of this code,
or any other comment that you think is appropriate.


More information about the Haskell-Cafe mailing list