Perhaps the quickest way would be
my_function left right
= uncurry another_function $ if some_condition
then (left, third_function right)
else (third_function left, right)
But jozefg's suggestion is rather cleaner IMO.
As for the updated question: when re-using results it's generally good to actually make them named variables, again jozefg showed how to do that in your problem. But (also bridging to your imperative thing): Haskell has monads, which can be used for anything imperative (and of course much more). In your case, the Reader
monad, aka function does the trick:
import Control.Monad.Instances
my_function left right =
( uncurry fourth_function >>= flip (uncurry another_function) )
$ if some_condition
then (left, third_function right)
else (third_function left, right)
but this style's readability is rather questionable.
It does get a little better with the helpers for arrows, of which functions again are a special case:
import Control.Arrow
my_function = curry $
( uncurry fourth_function >>= flip (uncurry another_function) )
. (if some_condition then second else first) third_function