The Rise Of Functional Programming: F#/Scala/Haskell and the failing of Lisp
Over at Lambda The Ultimate, the best academic programming blog on earth, there is a large debate going on regarding what the future of languages will be for 2008. The most important thing to emerge from the discussion is the larger role functional programming will play. It seems like a safe bet. This year has seen the explosion of interest and creation of functional languages such as Apple OS X’s Nu, Java’s JVM using Scala and Microsoft Research’s .Net language F#.
I am ecstatic at this change.
The Failure Of Lisp
It’s hard to understand where it came from. Certainly one can argue the broader academic community had nothing to do with it, the old guard Common Lisp hackers are still as fickle and as judgmental to new comers as ever. Also, the old standards in Lisp languages, Franz and LispWorks have not lowered their prices to anything approachable to the casual developer. There are open source ANSI Lisp implementations without all the supporting engines and functionality, such as SBCL. In fact, my most linked thing I’ve ever written in my career is the installation walk-through I did for installing SBCL and Allegro which includes adding your repository and packages for CLOS and automatically compiling the FASL files, especially dealing with the asdf differences between the implementations. The complexity of this in itself points to problems with portability and configuration in Lisp. However, even that project that targeted Lisp’s Bread and Butter, the parsing of semantic ontologies for the Semantic Web, was met in the message boards with worries on if there would be enough developer participation using such an odd language, and recommendations on moving it to Java.
In reality, Common Lisp showed its failure as a community by sitting out this enthusiasm that has been generated around functional programming languages. It didn’t have to be that way. I recall my first awarenesses of functional programming’s growth was the awesome work of Lemonodor’s blog and Sriram Krishnan posting “Lisp Is Sin“. I was happy at the time that Lisp was getting such attention, as well as functional language architectures in general. I imagined that as OO languages had grown so verbose and feature dense that even the IDEs to develop your applications run in to the tens of gigabytes, a new evolution “Back To The Future” was inevitable. Even more, I believe long suffering Lisp deserves to be back in favor again, it’s certainly spent its time in purgetory. Yet, it didn’t happen. You can blame the old 50 year old men sitting on IRC channels for that. It was the most thorny and un-inspiring community I’ve ever participated in, despite my extreme interest in the language. It’s jaw dropping that a language with such promise has sat out the resurgence, and speaks to what an un-friendly and un-inviting community can do a technology platform. I would be the first to march it off to the grave.
The Rise Of Functional Languages
The interest in functional programming actually grew up around more academic but pure languages like Scheme and Haskell. Although these languages sit within their own island and lack many of the “dirty” aspects of Lisp’s CLOS environment that make it easy to access OS and hardware resources, they are still strikingly useful in learning things that are the staple of functional languages, such as Closures and Lambdas. Indeed, one could argue that the movement to move Closures in to OO languages (first C#, now Java) was in part due to the rise of awareness of functional languages.
Further, it seems to me that functional programming languages answered two prayers of those more ambitious engineers who don’t seem to want to stick with the script and Java worlds they were taught in college. Those two large wins, far more important than the semantic features of functional languages that have gotten all the attention, are architecture foundations of functional languages:
- Referential Transparency / Side Effects
- Concurrency
Referential Transparency
To those coming from a pure OO world, Referential Transparency and the restriction of side-effects can be something hard to get their heads around. The best way I describe this concept is by hitting at the root of their assumptions: Everything they deal with are dead. The objects are dead, the variables are dead, the entire atmosphere is dead, as if something had come along and killed everything in your stack and you have to assemble your program by only what’s been given to you, nothing more. There are no instances, objects do not “come alive” and have state; a state that you have to poke in to and a state that can change at any time. A function will always do what you expect, and nothing can come along and change that behavior.
One of the things that seems to appeal to developers most about the promise of SOA architectures happening in enterprise environments, if you’re smart enough to pry it out of them, is that they get the same referential transparency in services. No one can override a service (besides versioning, which is explicit to the developer) and a service will only return what it did earlier in your code and earlier in the year. This forces developers to design services that have the same relationship to the world as functional programmers write their functions for. This is perhaps the trickiest part of migrating enterprise teams to a services based model, their expectations of the mutableness of the services they are accessing and their inability to anticipate what working in that world will be like. Especially for those who use tools or libraries to convert service interaction in to an object, the interaction can be jarring.
However, the soon find the predictability and the safety of such an environment liberating. In much the same way OO programmers were use to making their objects or variables immutable to maintain their contracts and relationships with other objects, often sacrificing many of the benefits that OO programming promised their stack, now they have immutability and transparency in an environment where functional paradigms are key, they do not expect to be able to “embrace and extend” services. They are what they are. This tends to cascade out to the living instantiated code a developer writes as well, as there is no point in entering the world of the living if what you have to return to is a dead function.
This was hinted at in an article in the ACM Queue magazine by Terry Coatta, entitled “From Here to There, The SOA Way“. He states,
Objects are still a very good way to model systems and they function reasonably efficiently in the local context. But they don’t distribute well, particularly if one tries to use them in a naive way. A service-oriented architecture solves this problem by dealing with the latency issues up front. It does this by looking at the patterns of data access in a system and designing the service-layer interfaces to aggregate data in such a way as to optimize bandwidth, usage, and latency.
Not that SOA limitations are the only thing that is affecting the consciousness of a software engineer, the other issue is the large rise in the complexity of managing a large enterprise library written in an OO language. One of the largest pain points of any application of large size is the management of graphs and graphs of live objects and the living data within them. When software engineers experience the lack of side-effects in functional languages, it’s a breath of fresh air.
Concurrency
A funny thing happened on the way to those multi-core processors. People loaded their applications on them and noticed nothing got much faster, particularly when it came to transaction intensive tasks. Turns out Intel and AMD left out an important fact about their Moore’s Law cheating multi-core environment: you can’t ring as much performance out of it without changing the way you manage concurrency and threads. Sequential programming could always rely on going faster as the single processor speed got faster, but as multicores come in to play that isn’t always the case. You want to farm off transactions to occur on separate processors, and in the living world of mutable objects and variables, breaking out two transactions to work concurrently that operate on the same living data is a bad idea. Add structural programming’s solution to this problem, optimistic and pessimistic locking, and you have dead-locks in short order.
Functional programming has been a natural place to explore parallel processing and new ways of doing atomic transactions because of the reasons above. More important, these atomic structures can be composable which is lost when doing locks in structural programming. A lot of the buzz has been generated around the idea of software transactional memory, where execution blocks can be flagged and managed and built upon. The best introduction to this topic is the paper by Tim Harris entitled Concurrent Programming Without Locks. Although this use to be expressed only in the confines of Concurrent Haskell, others have shown how the same techniques can be used in other functional languages, such as F# using nothing more than PowerList.
This experimentation is one of the large reasons why functional languages have become more important as software engineers wrestle with the problems and promise of multi-core processors in transaction processing. Although not every engineer will be interested in the deeper details of STM or other strategies in concurrent programming, the fact that these libraries will emerge and only be available in the functional realm will force software engineers to learn the core concepts and bring even more visibility to the functional programming space.
Functional Hybrids: Functional Programming Is Now Approachable
The other driver for adoption of functional programming languages, besides the architectural benefits it has to solve current problems, is the fact that languages such as F# and Scala have adopted a more hybrid model in their language design, where a developer isn’t forced completely outside her comfort zone. Scala is a combination of functional and deeper OO methodologies (as in SmallTalk) and has access to the entire Java library, significantly reducing the learning curve. The same can be said for F# and .Net and Nu and Objective-C. This does have draw-backs however, as both F# and Scala have not been able to use more of the STM strategies that Concurrent Haskell allows because the underlying thread architecture of the VMs they run against are built for structural programming languages. It is easy to see how this can be fixed, however, and allow those using hybrid functional languages the same power as those who express their ideas in Haskell or even Lisp.
As I said, I am excited about this new resurgence in functional programming languages, and I am enthusiastic 2008 will have even more to offer those who are just getting their toes wet. I personally know some college freshman who started out using Nu as their first language, and are already contributing to the community. The future of software engineering is bright.

January 13th, 2008 at 4:56 pm
its = belonging to it
it’s = it is, it has
January 13th, 2008 at 6:44 pm
Check out Clojure (http://clojure.sourceforge.net). It is a mostly functional Lisp-1 on the JVM which employs STM for concurrency. Worth a look.
January 13th, 2008 at 8:05 pm
Pedant:
Yes I wrote this very late at night, didn’t grammar check. Thanks for the info.
(must be a lisper)
January 13th, 2008 at 9:23 pm
Blog hype != reality. Use stats not hype.
January 13th, 2008 at 10:27 pm
Ah, if I could fail consistently for nearly six decades, and fail at everything a decade earlier than anyone else, I’d be very happy… (Nothing says “fashion victim” more definitively than a proclamation that “Lisp is a failure” right next to a recommendation of Haskell - or perhaps you’d care to argue for the runaway success that was, er, Miranda?)
January 13th, 2008 at 11:43 pm
gwenhwyfaer:
Thanks for making my point on the Lisp community for me :-)
January 13th, 2008 at 11:51 pm
Brandon,
Great article! Lovely response from the Lisp troll.
> I personally know some college freshman who started out using Nu as their first language, and are already contributing to the
> community.
Don’t know if you were talking about me (we did talk earlier, and I am a college freshman), but Nu is definitely not my first language. It’s the fifth one that I know well, and probably the eleventh one that I’ve done a moderate amount of coding in. :-) I started with Python in the seventh grade, and never really looked back.
January 14th, 2008 at 1:11 am
Yeah, because Haskell support is INCREDIBLE. They are just as “thorny” as the Lispers.
I too would like something solid besides “My friend uses Nu and it is going to REVOLUTIONIZE the industry!” Blog hype without stats is so pathetic.
January 14th, 2008 at 1:21 am
Brendan and Patrick,
I notice that you reach for the Troll label rather than reply to what is otherwise a perfectly natural response to your post.
Are you not merely reflecting on ignorance.
January 14th, 2008 at 8:24 am
I’m not sure when you last visited the lisp IRC channel, but everytime I’ve needed help and enquired there(in the past 2 years), the community have been as helpful as can be expected. I personally find honest answers to questions refreshing, even if it is critical of what I am enquiring about. It’s natural for Lisp to influence its community to think on a more abstract, “meta” level. ;)
January 14th, 2008 at 11:41 am
Lisp sucks, and so do you: Scheme is not pure - not much purer than Common Lisp. See SET! VECTOR-SET! etc.
January 14th, 2008 at 12:51 pm
…Except I’m *not* a Lisper; I’m a Forther by preference, an assembly coder by inclination, and a polyglot by profession.
You, on the other hand, appear to be little more than a wannabe (a class with significant “fashion victim” overlap) who hasn’t yet achieved the maturity required to deal properly with criticism. So much easier to come back at everyone who points out that you’re being an idiot with a label and a prejudice, isn’t it? Especially if you have another wannabe like Master Thomson cheering you on.
When you grow up, you might reflect that despite their mutual exclusivity, popularity is no substitute for wisdom.
January 14th, 2008 at 12:54 pm
The problem with the Lisp community is that they are an order of magnitude smarter than the average programmer, and are not afraid to hide it. Most people in that community are doing stuff much more complex than web apps and desktop bullshit. Given that fact, the talk is much more about optimization, language constructs and future/past than integration and hype.
Common Lisp is not the answer to everything as people would like to consider it. And when the uninformed discovers that he is more than upset that Lisp is not the solution to all his problems as it is advertised to be. No functional language is, actually. Functional languages (and their communities) are specially difficult to deal with because those doing it are not your average Java programmer. Functional language is like OO: it’s great, IF you can do it right.
How people can bash Lisp is beyond me. The argument is “Common Lisp is not PURE as Scheme or Haskell” or “CLOS is not massaging passing”. Do anyone know another language which is 50 years old and STILL matters in an argument? Do anyone know another language which has more practical applications, within the Functional paradigm? Java is barely a decade old and is disintegrating.
Would I prefer Scheme over Common Lisp? Yeah. It’s cleaner, purer, and downright prettier. But Scheme can’t address the problems CL is prepared to. The hype on ‘pure functional languages’. Purity in functional languages is overrated, and you know why? Because NO ONE does it! No one cares all that much about encapsulation and information hiding. Every OO project has some MAJOR crimes against the OO paradigm.
So, back to my point: functional languages only matter to those who can code it. Just like in OO, if you give a beautiful language like Haskell (and ‘pure’) to a lame coder he’ll produce code so ugly you’ll scream to go back to Java. And the industry does not have many coders who can do FP justice. The companies who do not have the staff, or the management intelligence (oh, wait. What IS that?) will be killed by FP.
Paraphrasing Dijkstra: FP is one of the most difficult fields of Programming. The poorer programmers might want to stick with pure OO.
January 14th, 2008 at 3:21 pm
[...] Brandon Werner » Blog Archive » The Rise Of Functional Programming: F#/Scala/Haskell and the faili… Over at Lambda The Ultimate, the best academic programming blog on earth there is a large debate going on regarding what the future of languages will be for 2008. The most important thing to emerge from the discussion is the larger role of functional prog (tags: http://www.brandonwerner.com 2008 mes0 dia14 at_tecp F# Lisp crítica programming) [...]
January 14th, 2008 at 3:52 pm
YOU SUCK.
No just kidding. I think the main problem with Lisp is nothing to do with Lisp. Rather that Lisp doesn’t need to really change anymore because any problems can be smoothed over by libraries.
I would say that the majority of Lisp development *is* the desktop however. I pulled that one out of my ass.
January 21st, 2008 at 6:21 am
[...] Scala will gain momentum, and at least one high visibility project will use Scala”. Brandon chimes in with “The most important thing to emerge from the discussion is the larger role functional [...]
May 5th, 2008 at 1:01 pm
[...] took Franz and other Lisp companies to task a few weeks ago in a posting I wrote: The Rise Of Functional Programming: F#/Scala/Haskell and the failing of Lisp: It’s hard to understand where it came from. Certainly one can argue the broader academic [...]
June 16th, 2008 at 3:38 am
[...] language (I’m suspicious you can even do STM well in an imperative language with state - as I discussed before) but beyond suggesting the keyword “atomic” to replace “synchronized” in [...]