リファレンスでは下のような説明になっています。
各要素をブロックに渡し、その返り値を連結した配列を返します。
ブロックの返り値は基本的に配列を返すべきです。ブロックを省略した場合は、ブロックを受けとり 上で説明した評価をし、その結果の配列を返すEnumerator オブジェクトを返します。
つまり、flatten→mapではなく、map→flatten。
[1]pry(main)> a = [[1, 2], [3, 4], [5, 6], [7, 8]]
[2]pry(main)> a.map{|i| i.inject{|sum, j| sum += j}}.flatten
=> [3, 7, 11, 15]
[3]pry(main)> a.flat_map{|i| i.inject{|sum, j| sum += j}}
=> [3, 7, 11, 15]
flattenがおしりにぶら下がるようなコードは余り美しくない(主観)ので、積極的にリファクタリングしてもいいような気がします。
それから、flat_mapが導入されたことでArrayがListモナドとして働くらしいですが、そもそもListモナドって何? と言うところからになってしまってよく判りません。自己関手の圏におけるモノイド対象ってなんですか?