HACKER Q&A
📣 mollerhoj

OOP in Functional Programming Language


I find that my ruby code more and more resembles functional programming:

Instance variables are always set in the constructor, and almost never mutated.

The thing I like about OOP is really just that the methods of an object don't have to take a bunch of parameters, but that it instead can rely on the instance variables. I guess in functional programming, this would be something like having a (constructor) function that returns a hash of methods that have been given what in OOP would be instance variables as their first parameters, and then only need non-instance variables through currying. My question is, is there a functional programming language that not only supports, but `encourages` this OOP style programming?


  👤 PaulHoule Accepted Answer ✓
Back in the day (finishing up my PhD thesis in 1998) I would write C code with functions like

  some_method(Object* this, ...)
that was effectively "object based" even if there was no support for inheritance. Ultimately this style reifies data structures as objects and provides a systematic approach to many problems such as how you allocate memory. The one area where I feel it falls short is that there ought to be some way of switching from struct-of-arrays to arrays-of-struct representations.

This is not too different from how many real object-oriented systems are implemented.

There is a quite a bit of overlap between "using functional programming techniques to implement an object-oriented style" and "using object-oriented techniques to implement a functional programming style."

There's nothing more annoying in the lower teachings of programming that circulate than the "FUNCT10NS RULE, 0BJECTS DR001" sentiment you see so much of.


👤 schwartzworld
JS doesn't have true classes, but I use the class keyword often to do what you're describing: creating immutable OOP style models that i can pass around as function arguments.

👤 nagasadhu
F#. It's functional first. Supports currying, HoF, maybe types, composition, pipelining and most of the functional goodies. It offers a neat indented syntax for OOPs.

You can also do function calls with optional arguments with defaults.


👤 dave4420
Case classes in Scala? (Although traditional imperative classes are also available, so maybe this doesn’t count as encouraging your desired style.)

👤 srivathsaharish
pony is the word