
I'll dig for it later if you like. The essence of the matter was a bunch of functions that looked something like this:
foo = do b' <- readTVar b c' <- readTVar c d' <- readTvar d return (b' + c' / d')
In other words, a string of readTVar statements, followed by one computation on the results. Each variable name has to be duplicated before it can be used, and the function is four lines long instead of one.
if that happens frequently, an instance of the numeric classes seems called for, automating both the lifting and the readTVar, but if there are only a couple of cases, you could lift the operations for the module, or even per definition: foo1 b c d = readTVar b + readTVar c / readTVar d where (+) = liftM2 (Prelude.+) (/) = liftM2 (Prelude./) claus