1.9's New Methods

First a big shout-out to Marc-Andre L. 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!

On Apr 15, 2010, at 4:06 AM, Intransition [email protected] wrote:

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!

i use Hash[*collection.map {…}.flatten] all the time.

On Apr 15, 7:30 am, Ryan D. [email protected] wrote:

i use Hash[*collection.map {…}.flatten] all the time.

I see. But really? So now you will use:

    Hash[*collection.flat_map {...}]

But that explains why this would never have occurred to me. I use:

    collection.map {...}.to_h

Thanks.

On Thu, Apr 15, 2010 at 8:30 PM, Ryan D. [email protected]
wrote:

 def flat_map(&block)

Hash[[1,2,3].map{|i| [i,i*2]}]

{1=>2, 2=>4, 3=>6}

RUBY_DESCRIPTION

“ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux]”

On Apr 15, 2010, at 1:06 PM, Intransition wrote:

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!

One advantage of :flat_map over map(…).flatten(…) is that it can be
chained in an Enumerator.

Sometimes, this can come in handy.

Regards,
Florian G.

On Apr 15, 2010, at 06:34 , James Edward G. II wrote:

On Apr 15, 2010, at 6:30 AM, Ryan D. wrote:

i use Hash[*collection.map {…}.flatten] all the time.

Me too, but it’s needed less in 1.9 I think. Hash[…] now accepts an Array of Arrays.

nice. too bad I don’t use 1.9 at all.

On Apr 15, 2010, at 6:30 AM, Ryan D. wrote:

i use Hash[*collection.map {…}.flatten] all the time.

Me too, but it’s needed less in 1.9 I think. Hash[…] now accepts an
Array of Arrays.

James Edward G. II

Intransition wrote:

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