functor (M : Map.S-> sig val red : 'M.t Reducer.t end