code: def lr(self, lis, op):
          
          it = iter(lis)
          res = trans(it.next())
          for e in it:
              e = trans(e)
              res = op(res, e)
          return res
docs: performs this operation on a list from *left to right*
          op must take 2 args
          a,b,c  => op(op(a, b), c)