Quantcast

Ruby on Rails, Io, Lisp, JavaScript, Dynamic Languages, Prototype-based programming and more...

Technoblog reader special: $10 off web hosting by FatCow!

Wednesday, November 08, 2006

Functional Programming in Ruby

In Ruby, iteration is done mainly functionally with methods like each and map. We call this type of iteration functional because we are passing a function to be called on each item in the collection.

[1,2,3].each { |item| puts item + 1 }

In this example. the function being passed is { |item| puts item + 1 }. In fact!

print_function = lambda { |item| puts item + 1 }
[1,2,3].each &print_function

Accomplishes the exact same behavior.

This is very much from the functional programing paradigm. Now, one thing that I can not stand to see in Ruby code is this.

def convert(old)
new = Array.new
old.each do |item|
new << transform(item)
end
new
end

The first hint that there is something wrong is the very odd call to return the new variable at the end of the convert method. It seems odd and awkward, and that is a hint that you are working against the grain. Here is how it should look.

def convert(old)
old.map { |item| transform(item) }
end

Or alternatively:

def convert(old)
old.map &method(:transform)
end

Notice how clean and beautiful this is. We are working with the grain of functional programming here. Not only that, but there is less to debug, less to maintain and it takes less time to grok what is going on.

If you want to learn more about the functional programming roots of Ruby, I recommend learning OCaml, I am really enjoying it.

You should follow me on twitter here.

Technoblog reader special: click here to get $10 off web hosting by FatCow!

14 Comments:

Anonymous j`ey said...

Although, some of this only works with Symbol#to_proc of course!

11:57 PM, November 08, 2006

 
Anonymous zerohalo said...

Thanks, Lucas - though I've read and coded this sort of thing before, having some of these things spelled out from different perspectives is nice for those of us learning Ruby.

I understand passing a proc to old.map, but I don't get how &method(:transform) works. I'm assuming 'transform' is a custom method defined in the class. Does that mean that &method will call the 'transform' method, automatically passing each element in 'old' to it and returning the value? Is there any advantage of using that over { |item| transform(item) } ?

11:58 AM, November 09, 2006

 
Anonymous Anonymous said...

A real functional language is even better:

convert = map transform

(Haskell)

12:28 PM, November 10, 2006

 
Anonymous Anonymous said...


A real functional language is even better:

convert = map transform

(Haskell)

Damn straight!

2:56 PM, November 10, 2006

 
Anonymous Anonymous said...

As an aside, what OCaml book(s) do you recommend? I almost bought the Practical Ocaml book that just came out, but I'm seeing lots of bad reviews of that book.

Also, how about a PDX OCaml meetup?

3:19 PM, November 10, 2006

 
Anonymous Olle Jonsson said...

Thanks, Lucas, I found some neat stuff in libxml-ruby connected to this while implementing your more idiomatic way of expression in some code I had inherited.

Here is the blog post about it.

8:08 AM, November 12, 2006

 
Anonymous Curt Sampson said...

I don't recommend Practical OCaml; I have it and it's certainly not a good book for learning a functional programming style. I've got a longer review up on lambda-the-ultimate.org, in the item on that book.

In fact, the book put me off OCaml so much that I've switched to developing in Haskell instead. Haskell syntax is much more elegant.

However, if you're new to functional programming, a very good book to start with is The Little Schemer. It will really give you the feel of FP.

8:11 PM, November 30, 2006

 
Anonymous Curt Sampson said...

I don't recommend Practical OCaml; I have it and it's certainly not a good book for learning a functional programming style. I've got a longer review up on lambda-the-ultimate.org, in the item on that book.

In fact, the book put me off OCaml so much that I've switched to developing in Haskell instead. Haskell syntax is much more elegant.

However, if you're new to functional programming, a very good book to start with is The Little Schemer. It will really give you the feel of FP.

8:12 PM, November 30, 2006

 
Anonymous Anonymous said...

i buy hydrocodone at buy hydrocodone - can't find any cheaper

7:02 AM, January 28, 2007

 
Blogger CarlH said...

Why don't you use collect!?

8:58 AM, April 03, 2007

 
Blogger Kerry Buckley said...

CarlH said...
Why don't you use collect!?

collect and map are synonyms, and can be used interchangably.

5:01 AM, July 03, 2007

 
Anonymous Anonymous said...

i downloaded ruby, and i want to learn to program and everyone says its the easiest language to learn and ive read alot of tutorials on how to program for beginners but i still have literally no idea where to start... will someone please help me understand

4:36 PM, December 26, 2007

 
Anonymous Andras said...

Hello!
My pick for the easiest language to learn would be definitely Python. I recommend you start with that. It is simple and clean, yet powerful. Ruby is really nice but Python is way more straightforward for a beginner, and is well documented.

3:00 AM, January 17, 2008

 
Blogger Geira said...

Instead of Practical OCaml, check out The Functional Approach to Programming by Cousineau and Mauny. Admittedly it uses Caml Light instead of OCaml, but the differences are very small (except that it doesn't cover OOP). It's gotten good revies and covers nicely the main points of FP.

There's also OCaml for Scientist by Harrop which I haven't read, plus a French O'Reilly book that's been translated into English.

12:37 PM, June 05, 2008

 

Post a Comment

Subscribe to Post Comments [Atom]

<< Home

 

If you like this blog, you might also like top photography schools.