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