Hi Joshua,
Thank you for the comment.
I wouldn't say it's necessarily redundant, as it may be beneficial in certain situations. The operate function may provide added flexibility and abstraction, for example by calling the operate function instead of the add or multiply function directly, you can change the behavior (e.g. adding more operation functions) of the code without modifying the call sites. Or you could swap the add or multiply function for a more efficient add or multiply function, without modifying the code where these functions are called. So, the operate function could work as an interface.
But at the end of the day, it was just an example to illustrate the difference way of thinking in OOP and FP.