Slashdot Mirror


Purely Functional Data Structures

andrew cooke writes "A while ago I read the comments following a Slashdot book review. Someone had posted a request for books that covered a wider range of languages than Java, C, Python, etc. Well, I thought, why not review Okasaki's Purely Functional Data Structures? It's a classic from the underworld of functional programming - recognised as the standard reference, yet clear enough to work as an introduction to the subject for anyone with a basic functional programming background. Of course, some readers won't know what functional programming is, or what is special about pure data structures. So I hope that this review can also serve as something of an introduction to the languages that I (a software engineer paid to work with Java, C, Python, etc) choose to use in my spare time, just for the joy of coding." Read on for the rest; even if you're not planning to give up C or Perl, there are links here worth exploring. Purely Functional Data Structures author Chris Okasaki pages 220 publisher Cambridge University Press rating 8/10 reviewer Andrew Cooke ISBN 0521663504 summary Functional programming for grown-ups.

In Okasaki's introduction he says that the "[...] benefits of functional languages are well known, but still the vast majority of programs are written in imperative languages such as C. This apparent contradiction is easily explained by the fact that functional languages have historically been slower than their more traditional cousins, but this gap is narrowing."

Indeed, OCaml has a reputation for being "as fast as C," yet it contains automatic memory management and supports object-oriented, as well as functional, programming. It's also probably the most widely used functional language outside academia (except perhaps Lisp/Scheme).

I mention OCaml not just because it's fast, free and popular, but because Okasaki uses a related language - ML - in his book. The ML family of languages are the standard strict, functional languages (Standard ML of New Jersey is perhaps the reference implementation but see also standardml.org). Okasaki also includes an appendix with examples in Haskell, which is the standard lazy functional language.

The difference between lazy and strict languages is the order in which code is evaluated. Most languages are strict. Unlike most languages, Haskell only evaluates something when it is absolutely necessary. Each parameter to a function, for example, is passed as a "thunk" of code, not a value. If the value is not required inside the function, the parameter is left unused; if it is required (say as part of a result that needs to be displayed) then the thunk is evaluated. This evaluation may trigger a whole slew of evaluations of functions that "should" have been called earlier (from a Java programmer's point of view).

Laziness is both good and bad. The bad side is obvious: the order in which code is executed my be very different from the order in which the program was written and some serious book-keeping is necessary in the compiler to juggle the thunks of code and their final values. The reordering of code could cause mayhem for IO operations, for example (in practice, of course, Haskell includes a solution to this problem).

The good side is that laziness can help make programs more efficient and, while the definition of ML doesn't include laziness, individual ML implementations -- including OCaml and SML/NJ -- include it as an extra.

Much of Purely Functional Data Structures (the second of three parts) focuses on how to use laziness to make data structures efficient. Lazy evaluation allows book-keeping actions to be postponed, for example, so that the cost of maintaining the data structure in an efficient form can be averaged across several read/write operations (improving worst case limits - avoiding a very slow response if the data happen to be in a "bad" order).

An understanding of how the efficiency of algorithms is rated (the big-O notation) is one piece of knowledge that this book does assume, along with a basic grasp of what Stacks, Queues, Trees, etc, are.

This lazy boost in efficiency is needed because, even though functional languages may be getting faster, it's not always possible for them to implement the efficient algorithms used in imperative (non-functional) programming.

But I'm getting ahead of myself, because I haven't described what a functional language is, or why it is useful. These are the topics of the first part of the book, which explains how functional languages, which make it impossible to change variable values by direct assignment, support persistent data structures. This section is fairly brief, and while it's a good refresher course for someone who's not had to worry about such things since studying at university, it's not sufficient as an initial introduction to functional programming in general.

There's a good explanation of functional programming in the Wikipedia, but, in all honesty, I don't see how anyone can really "get it" without writing functional code (just as I, at least, couldn't understand how OOP worked until I wrote code that used objects).

So forgive me for not telling you why functional programming is good (This paper is one famous attempt), but perhaps a better question to focus on is "Why should you spend the time to investigate this?" The best answer I can give is that it leads to a whole new way of thinking about programming. Describing functional programming as "excluding assignment to variables" doesn't do justice to the consequences of such a profound change (one I found almost unimaginable - how can you program without loop counters, for example?).

There's a practical side to all this too - learning new ways of thinking about programs makes you a better programmer. This ties in closely with the final part of Okasaki's book, which explores a few fairly esoteric approaches to data structures. Who would have thought that you can design data structures that parallel the way in which you represent numbers? Some of this is pretty heavy going - I can't say I understood it all, but I'm taking this book with me on holiday (it's slim - just over 200 pages) and I'll be bending my brain around some of the points in the last few chapters as I lie in the sun (here in the southern hemisphere it's late summer).

So just who would benefit from this book? It seems to me that it's most valuable as a second book on functional programming. There are a bunch of texts (and online guides) that can get you started in functional programming. This one goes further. It shows how to exploit the features of functional languages to solve real problems in applied computing. Admittedly, they are problems that have already been solved in imperative languages, but you might find that you, too, come to enjoy those famous benefits of functional languages. The algorithms in this book let you enjoy those benefits without paying the price of inefficiency.

Andrew Cooke last reviewed for Slashdot The Aardvark is Ready for War . You can purchase Purely Functional Data Structures from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, read the book review guidelines, then visit the submission page.

17 of 427 comments (clear)

  1. Re:Eurotrash by Anonymous Coward · · Score: 0, Funny

    Good thing they left 300 yers ago then.

  2. Purely *Functional* Data Structures by Orne · · Score: 4, Funny

    As opposed to what, Data Structures that don't work? Yeah, we need more books on those...

    1. Re:Purely *Functional* Data Structures by MooseByte · · Score: 5, Funny

      "As opposed to what, Data Structures that don't work? Yeah, we need more books on those..."

      Fear not, MFC is extensively documented.

      (Complains I, recently bit by yet another lame long-acknowledged-yet-unfixed bug in M$'s class libraries.)

    2. Re:Purely *Functional* Data Structures by Michael+Iatrou · · Score: 2, Funny

      Have you tried Microsoft Press?

    3. Re:Purely *Functional* Data Structures by aafiske · · Score: 2, Funny

      Actually I'd prefer a book on Purely Fictional Data Structures. You know, like Hobbit Hair Queues and Keebler Elf B-Trees.

      Sorry, I'll stop now.

  3. Over where I work by Anonymous Coward · · Score: 5, Funny

    Management prefers dysfunctional programming.

  4. I don't even see the code.. by laurent420 · · Score: 5, Funny

    blonde... brunette..

  5. Misread Headline by glarvat · · Score: 2, Funny

    At first I read the headline as "Purely Fictional Data Structures."
    I was really confused for a minute thinking, "What do ficticious data structures have to do with ML or Lisp?"

    1. Re:Misread Headline by yerfatma · · Score: 2, Funny

      They're especially good for handling release dates.

  6. Not a typewriter by JoshuaDFranklin · · Score: 5, Funny
    But I'm getting ahead of myself, because I haven't described what a functional language is, or why it is useful. These are the topics of the first part of the book...

    You know, your computer is not a typewriter, so you really could have rewritten that part of your review...

    1. Re:Not a typewriter by ornil · · Score: 5, Funny

      He did, but because of lazy evaluation it ended up after the second part.

  7. I like any language by donnyspi · · Score: 5, Funny

    that supports GOTOs. Those are the best!

  8. What is the world coming to? by TwistedSquare · · Score: 3, Funny
    A while ago I read the comments following a Slashdot book review

    Next thing we know, people will start reading the books as well!

  9. eek! by happyfrogcow · · Score: 2, Funny

    article... triggering... college... flashbacks.


    ..must.. resist...


    ..cannot.. fight.. functional


    ..language.. tempatation...



    *head explodes*

  10. XSLT by Black+Perl · · Score: 2, Funny

    I think a good study of a purely functional language could really improve my perl, python, or ruby.

    A good study of the purely functional language XSL will really improve your appreciation of perl, python, or ruby!

    --
    bp
  11. Now what I'd like to see by OpMindFck · · Score: 2, Funny

    is Purely Fictional Data Structures.
    Just think of the Zen Koan Binary Tree.

    --
    Sipping on Jolt and Dew. Laid back. With my mind of my cubicle and my cubicle on my mind.
  12. Re:functional algorithms by Mr+Smidge · · Score: 2, Funny
    I was taught functional programming by a rather camp lecturer, who spoke with a lisp (no pun intended), and I could never keep a straight face whenever he said 'bottom'. Nor when he pronounced 'sqrt' as 'squirt'.

    He once defined a function called 'my', and then proceeded to use the unfortunate expression "squirt my bottom".

    Now, whenever I see Haskell, I see it as being just riddled with sexual innuendo that I can't get out of my head.....

    > minus x = x - 1
    > lubricated x = x == 0
    > harder x y = x * y
    > stop = 1
    > my x = x
    > bottom = my

    > but thrust =
    > let deeper = minus thrust
    > in my bottom (if lubricated thrust then stop else thrust `harder` (but deeper))


    Nah, nothing dodgy about that at all..