a la Haskell:
;;reducing fn
x->a->x
;;transducer fn
(x->a->x)->(x->b->x) ;;reducing fn
x->a->x
;;transducer fn
(x->a->x)->(x->b->x) -- Left reduce
type Reducer a r = r -> a -> r
-- Here's where then rank-2 type is needed
type Transducer a b = forall r . Reducer a r -> Reducer b r