It has been said that C# can be regarded as a functional programming language, even though it is widely recognized as a OO programming language.
So, what feature set makes C# a functional programming language?
I can only think of:
- delegates (even without anonymous methods and lambda expressions)
- closures
Anything else?
C# has borrowed a lot of features from ML and Haskell for example:
C# 2.0 brought us parametric polymorphism (or ‘generics’). I’ve heard that Dom Syme, one of the creators of F#, was largely responsible for implementing generics in the .NET BCL.
C# 2.0 also allows programmers to pass and returns functions as values for higher-order functions, and has limited support for anonymous delegates.
C# 3.0 and 3.5 improved support anonymous functions for true closures.
LINQ can be considered C#’s own flavor of list comprehensions.
Anonymous types look like an approximation of ML records
Type-inference is a given.
I don’t know about you, but C# extension methods look an awful lot like Haskell type classes.
There’s been a lot of talk about the ‘dynamic’ keyword in C# 4.0. I’m not 100% sure of its implementation details, but I’m fairly sure its going to use structural typing rather than late binding to retain C#’s compile time safety. Structural typing is roughly equivalent to ‘duck typing for static languages’, its a feature that Haskell and ML hackers have been enjoying for years.
This isn’t to say that C# is a functional programming language. Its still missing important features such as pattern matching, tail-call optimization, and list and tuple literals. Additionally, idiomatic C# is fundamentally imperative with a heavy dependence on mutable state.
I wouldn’t necessarily consider some of those features mentioned above as exclusive to functional programming languages, but its pretty clear that the C# developers have taken a lot of inspiration from functional programming languages in the past few years.