The problem we thought we were solving was: How do you curry infix operators in prefix form, when
the operation is not commutative? Haskell solves this problem very elegantly. For example,
exponentiation. Haskell uses the caret symbol (
^) for this operation. You can use it infix
as you’d expect:
Converting to prefix and currying is beatiful. If you want a function to calculate e.g.
And if you want a function for
This is very surprising:
R.divide(10, 2) //=> 5
R.divide(10)(2) //=> 0.2
Uh-oh. Then J. A. Forbes pointed out:
Why is it that flipping twice removes the inconsistency?
R.divide = R.compose(R.flip,R.flip)(R.divide)
R.divide(10,2) //=> 5
R.divide(10)(2) //=> 5
This cat sums up the process pretty well. Started with so much optimism …
Clearly, our shiny, new implementation of
op–a way to curry operators in a left-section/right-section
fashion–was not only confusing, but inconsistent. It was holed below the waterline and sinking fast.
So, my apologies. I really thought we had something cool there. But it wound up being a dud.
We have learned from it, however. In the master branch of Ramda now, I have re-implemented
with consistent behavior and semantics, essentially using a “placeholder” approach, e.g:
But we may not stop there. This has us thinking we can have a generalized placeholder approach to currying. Early experiments are promising. I’ll try to keep you posted.02 October 2014