OO programming literature is full of design patterns. Most books on object oriented programming dedicate a chapter or two to design patterns like factories and decorators. So what are the equivalent patterns in functional languages and why hasn't anyone written a book about them yet? Is there something special about functional languages that obviates the need for design patterns?
-
6There are definitely functional design patterns - take memoisation or monads for example - I'm also wondering if anyone has gathered them in one place though...– FinnNkCommented Jul 3, 2011 at 7:58
-
4FinnNk Monad is more of a type class than a design pattern ^_^– alternativeCommented Jul 4, 2011 at 13:14
-
For haskell, Gabriel Gonzalez has some blog posts, for example haskellforall.com/2012/08/the-category-design-pattern.html– bennofsCommented Apr 16, 2014 at 12:51
-
2infoq.com/presentations/Clojure-Design-Patterns– boucekvCommented Jul 1, 2014 at 6:19
-
1Map reduce is one. I'm disappointed there isn't a good list of patterns– Sridhar SarnobatCommented May 31, 2015 at 21:15
6 Answers
Jeremy Gibbons is writing the book. Until it's finished, you can read his blog, Patterns in Functional Programming. He recommends reading his posts from oldest to newest.
Browse his publications as well. He covers Gang of Four patterns in Design Patterns as Higher-Order Datatype-Generic Programs and describes the patterns of programming with recursive equations in Origami Programming (folds and unfolds).
-
2At this point, almost 10 years later, I don't think Jeremy Gibbons is writing the book. Also, I'm sure there is a treasure trove of ideas in his blog posts, but it's not exactly as approachable or as focused on practicality / common usage as I would expect a "design patterns" book to be. Commented Oct 26, 2021 at 18:30
OO and functional programming are two very different programming paradigms, and design patterns (DP) is a significant part of OO design and programing. DP do not have such role in functional programming.
One could even say, that DP are not needed in functional programming -- there is no itch which DP is cure for.
One could argue that design patterns is a sign of missing features in a programming language.
Peter Norvig found that 16 out of the 23 patterns in the Design Patterns book are "either invisible or simpler" in Lisp or Dylan.
"Many patterns imply object-orientation or more generally mutable state, and so may not be as applicable in functional programming languages, in which data is immutable or treated as such." -- http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
-
50I'm not sure I would agree that design patterns don't apply to FP. FP still presents common problems that get solved in particular, common ways. Different problems to those solved in OO, but still problems nevertheless. I think it's probably just something that's been given a lot less attention than in OO, since FP is less common in the commercial world at the moment.– d11wtqCommented Mar 23, 2013 at 10:21
-
30To claim that design pattern doesn't exist in functional programming is misinformation. Easiest counter-example is the monad. You do not need to use monad in functional programming, but it is a very common pattern people follow to facilitate application of pure function programming. That in essence is the definition of design pattern. Commented Jul 7, 2014 at 4:22
-
4Design patterns apply to all design activity, whether programming or house design. In fact, the very concepts of pattern languages comes from architecture: en.wikipedia.org/wiki/A_Pattern_Language. Commented Aug 3, 2014 at 1:43
-
2Hmm. Observable streams, Railway Validation, and hell, pretty much every monad is a design pattern, right?– ChetCommented Apr 20, 2015 at 8:57
-
2@voidvector Monads are not simply a design pattern. In FP, monads are used as functors between type systems, and the concept itself comes from Category Theory, a branch of mathematics. They are used to describe a particular kind of relationships between an algebraic structures in general. It'd be more accurate to say functional programming is a design dattern to facilitate use of mathematics in programming. Commented Jul 7, 2017 at 17:33
The simple fact is that many OO Patterns would be considered Idioms in functional languages (especially the original GoF patterns). For instance the Iterator pattern (built-in to languages like C# now) just isn't necessary in a Lisp or ML which has sequence operators.
A lot of the patterns we use in O-O systems are there to help us get the "non essentials" out of the way so we can focus on coding objects. In other words, the patterns are solutions to the non-interesting parts of the application. We should leverage patterns to address common needs that have been solved before (like the patterns in Fowlers Patterns of Enterprise Application Architecture for dealing with things like database transmission, or xUnit Patterns for boosting your unit testing) so that we can focus on adding business value for the application.
I'm sure that beyond the specifics of the GoF patterns, there are design patterns that will be applicable to functional programming as well. The thing is that O-O is the dominant paradigm. Writing a pattern book that targets functional developers...well frankly won't get a greenlight from a publisher. That's what it boils down to. There isn't enough of a market for Functional Patterns to have a significant number of books dedicated to the topic.
A good talk (~45 min) on this topic by Stuart Sierra:
http://www.infoq.com/presentations/Clojure-Design-Patterns
Not necessarily binding and authoritative, but I recognized a number of his examples from my own experience using FP for data analysis.
Examples written in Clojure, but likely applicable to any FP language. The names he gives to the patterns he covers are:
- State/Event
- Consequences
- Accumulator
- Reduce/Combine
- Recursive Expansion
- Pipeline
- Wrapper
- Token
- Observer
- Strategy
If you're genuinely interested in learning the design patterns look no further than Haskell. If you take the time to learn the language the hard way you'll run into and get cozy with most of the foundational patterns -- they're baked into the language.
Don't skip over monads. There are a bunch of long-winded explanations out there and it takes some doing to have the ideas sink in, but if you keep plugging away, eventually it'll dawn on you and you'll be amazed at how many design patterns can be build on top of this one abstraction/interface.
Once you grok Haskell, you'll have enough of the FP arsenal at your disposal to be dangerous. Point is, keep at it until you get it. There are no shortcuts.
Insofar as the design methodology for FP is to design your types to accurately reflect the problem space and the implementation should follow automatically, the FP equivalent of a book on design patterns is something like Chris Okasaki's Purely Functional Data Structures.
-
1Okasaki's book is the equivalent of the data structure part of numerous data structure and algorithms books which usually consider only mutable data structure. Commented Jul 3, 2011 at 7:47
-
1I don't think equating data structures to design patterns fits the bill. It's not like OO programmers just flail their arms until the proper class definitions pop up.– user7146Commented Jul 3, 2011 at 7:53
-
Yes, Okasaki's book is at a lower level than design patterns.– FinnNkCommented Jul 3, 2011 at 7:55