I'm interested in both functional programming and object-oriented programming, and I'm curious about languages that intentionally bring the two paradigms together. I'm especially interested in something with genuinely strong functional features—closer to the style and expressiveness of Haskell—rather than simply a primarily imperative language with a few lambdas added. How have different languages tried to unify functional and object-oriented ideas, and which ones would be good to explore?
6 Answers
C# has first-class functions, lambdas, pattern matching, and immutable or functional-style libraries, so it’s possible to write fairly functional code in it. However, if the goal is to study a language designed around functional programming rather than deliberately adopting that style inside an object-oriented language, F# is likely the more natural choice. Python also supports both classes and functional techniques, although it is not as strongly functional as Haskell.
A lot of modern languages mix functional and object-oriented ideas to some degree. Java, Kotlin, C#, Python, JavaScript, and TypeScript all support functions as values, lambdas, or functional-style collection operations alongside classes and objects. The difference is that these languages generally don’t encourage functional programming as strongly as Haskell does, so they still make imperative code easy to write.
In that case, F#, OCaml, and Scala are probably better starting points than JavaScript or C#. C# can be written in a functional style, but the language itself still supports a lot of conventional imperative programming.
Common Lisp is another strong example. Its multi-paradigm design supports functional programming, object-oriented programming through the Common Lisp Object System, macros, generic functions, and several other styles. It may be less familiar than newer languages, but it demonstrates a very flexible approach to combining paradigms.
Thanks—that sounds like another interesting direction to look into.
OCaml also illustrates an interesting compromise. It is primarily functional but includes objects and classes, and it does not try to make everything purely functional. That makes it useful for seeing how object-oriented abstractions can coexist with immutable data, pattern matching, type inference, and higher-order functions. More generally, the best language depends on whether you want functional programming with optional objects, or an object-oriented language that has functional features.
Scala is probably the clearest answer. It combines object-oriented features such as classes, traits, and inheritance with powerful functional features including first-class functions, immutable collections, pattern matching, algebraic-style data modeling, and higher-order programming. It is also used in industry, so it’s more than just an academic experiment.
OCaml and F# are both worth investigating. They are primarily functional languages, but they also provide object systems and other tools for object-oriented programming. F# is designed for the .NET ecosystem, while OCaml has its own distinctive object model. Neither is purely functional, but both show interesting ways to combine the paradigms.
I’ve heard of both, but I don’t know much about them yet. I’ll add them to my list to explore.

That makes sense, but I’m specifically looking for something with functional programming closer to Haskell’s level, not just a language that happens to include lambdas.