How would you do something like high-order functions and partial application in object-oriented programming?For high-order function my mind immediately jumped to Guava's Function Interface. I said, "hmmmm, let's see, could have some method (maybe called
partiallyApply
) that took an argument and returned another Function
." In retrospect, this may have been overly complex, and a much simpler implementation of Function may work just as well in this case: fluent setters.Let's look at a contrived, dead-horse-esque example. A partial function that does addition on two arguments.
In Haskell, if I wanted to build such a function, and partially apply it to, let's say 5, I might do the following
add5 = (+) 5 add5 10 -- is 15In Clojure, this might look like
(def add-5 (partial + 5)) (add-5 10) ; is 15So, how would I do this using setters? Simple! Here's some Ruby code
class Adder def value(first) @first = first self end def to(second) @second = second self end def add @first + @second end end adder_of_5 = Adder.new.value(5) adder_of_5.to(10).add # is 15This code (obviously) has a lot more ceremony wrapped around it, but it does achieve some of the same benefits as partial application (e.g. laziness, partial parameter fulfillment). The point is, if this were Java code, I could easily implement
Function
and change add
to invoke
and have a partial function in an object-oriented system.
No comments:
Post a Comment