LoginSignup
6
7

More than 5 years have passed since last update.

Enumerable#flat_mapの動作

Last updated at Posted at 2015-11-30

リファレンスでは下のような説明になっています。

各要素をブロックに渡し、その返り値を連結した配列を返します。
ブロックの返り値は基本的に配列を返すべきです。

ブロックを省略した場合は、ブロックを受けとり 上で説明した評価をし、その結果の配列を返す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モナドって何? と言うところからになってしまってよく判りません。自己関手の圏におけるモノイド対象ってなんですか?

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7