Future also doesn't obey the monad laws for not being RT and that causes a lotttt of complexity.
Most all the theorist/logician/algebraist-turned-programmer folks I know all feel more-or-less the same way.
Just explain the pattern in english. Might as well call it a FooDeBar. Giving axioms and such is usually a waste of The Man's money and my time.
That said, I think it's extremely valuable to see this sort of thing in an academic or side project/enrichment activity setting. The mindset and mental model are fantastically helpful. See dshnkao's post, for example.
1. Don't use terminology from academic category theory / abstract algebra in computer programming
2. But if you haven't studied these things, and you are a programmer, it might be very enlightening to do so.
Is that right?
Woah there!
But otherwise, yes.
Most working mathematicians have seen category theory and borrow bits and pieces of notation and such. But most of their work is done in far more concrete settings.
Working programmers should adopt the same arrangement.
It's a subtle position, but not an inconsistent one. I promise :-)
Monads should never have escaped Haskell.
They should have put them in a monad.
You can derive `map` from these two other functions so it doesn't need to be part of the interface.
Confusingly, map in scala is fmap in Haskell
"To get an adequate definition of g [<] f we must therefore consider all possible algorithms for computing f."
You see, I was reading this paper because I'm currently looking into various ways of that the symmetries of Turing machines are modeled (I.e., the fact that a TM can emulate any other TM would seem to imply that the concept of an 'algorithm' must have fundamental features that are preserved across this kind of virtualization. Closely related to the concepts of an Oracle, a Non-deterministic TM, and recursion.)Now, this passage stood out to me because it seemed to be a set-theoretic, indirect phrasing of the exact symmetry I'm talking about. We have to consider all algorithms for computing f in order to recover the features that must be true for all f, and thus give identity to the notion of a general algorithm for f. Which in turn is used to establish theorems about such a general algorithm notion; (critically, its "relative complexity".)
My point being that I would not have expressed this notion in set theoretic language because my intuition wants it expressed in algebraic language. Things are identified by their symmetries, and building theories around symmetries directly is more efficient and insightful than building theories around how those symmetries are embedded in set theory. And when I sit around thinking about how to design a good API or an efficient program, I want to do it by stating what must always be true about the problems I'm solving, in a high-level, abstract way. (I'm not so good at it in practice.)
Set theory may be a simple model of many things, but it is only really intuitive for things that can be easily described in terms of unions and intersections. It is often just extra work elsewhere, at least if you have a frame of mind to see other ways.
[1] https://www.cs.toronto.edu/~sacook/homepage/rabin_thesis.pdf
Future, which is really a souped up promise abstraction, is the main star, and for-comprehensions are nice syntactic sugar. Being a "Monad" doesn't help you do anything with it though. And Future technically doesn't even truly obey the Monad laws, because of exceptions.
It's useful that a couple of container classes in scala use implement this trait:
But beyond making it a little easier to guess what's going on, the underlying math isn't useful in actual programming.