From: "Jörg W Mittag" Date: 2010-04-18T07:55:05+09:00 Subject: Re: 1.9's New Methods Intransition wrote: > First a big shout-out to Marc-Andre Lafortune and his backports project. Nice work. > > Now I want to ask if others have noticed all the new methods being add > to 1.9+? I'm quite happy about vast majority of it, but there was at > least one method I thought pretty peculiar. This Enumerable method: > > def flat_map(&block) > return to_enum(:flat_map) unless block_given? > map(&block).flatten(1) > end unless method_defined? :flat_map > Backports.alias_method self, :collect_concat, :flat_map > > I am very curious to know how it was decided that a normal map > followed by a 1-deep flatten is common enough to warrant its own > method? Two in fact! #flat_map is monadic bind (also known as flatMap in Scala, SelectMany in .NET and (>>=) in Haskell). The other monadic operator that is needed to build a monad, is unit (aka return in Haskell), but in an OO language, that's just a factory method, IOW it's just .new in Ruby. So, #flat_map can potentially turn any class that mixes in Enumerable into a monad, provided that it also obeys the monad laws, of course. Whether or not that warrants its own method ... well, I have no idea. jwm