The monoids package offers something similar to this: mapReduce :: (Generator c, Reducer e m) => (Elem c -> e) -> c -> m If we take (Elem c) to be (item), (e) to be (item'), (c) to be (full), and (m) to be (full'), it's basically the same thing, and offers the same advantages as the ones you listed, as far as I can tell. - Jake