This may be a mathematician's bias, but Category Theory is somewhat underwhelming because you can't really do anything with it. It's actually too abstract--you can model basically every branch of mathematics with Categories, but you can't actually prove very much about them from this perspective. All you get is a different vocabulary to talk about results that you already knew. It's also less approachable because its objects of study are other branches of mathematics, whereas most other branches have number, vectors, and functions as standard objects.
Abstract Algebra, Real Analysis, and Set Theory will provide you with very similar experience with heavy abstraction, while also teaching some specific tools that are more practical. Abstract Algebra is the beating heart of Fourier Transforms and crypto algorithms, as well as a similar experience with data transformations that you would get from Category; Real Analysis gives a lot of numerical algorithms, stability, and a good handle on dealing with unbounded scaling; Set Theory is relational databases, data representation, and again with the data transformations. Category Theory gives you Monads... which are actually pretty cool, but I honestly found Category Theory more of a hindrance than help in figuring how they work.
tl;dr Every programmer should learn math for the abstraction. Category Theory is pretty good for this, but other maths might be better because Category Theorists are the Architecture Astronauts of the math world.
It seems Category Theory might one day be useful in ordering "Upper Level Ontologies". Since it's logically impossible to have one consistent ontology( Incompleteness Theorem ) the next best thing is to find morphisms across knowledge domains, no?
""The amount of information out there is growing exponentially. The amount that needs to be known before you can contribute keeps exploding with each generation. Such that the practitioner might know just as much if not more than their predecessors but the scope of their knowledge as a fraction of the full body is many orders of magnitude smaller.
It is not just a matter of will but of physics of time and the chemistry of the brain. Underutilized connections fade such that unless you spent time actively practising the wide skill sets to sufficient depth they will fade. But there is not enough time to be able to do that.
I do think that more must be done in enabling bridges as a counter to this. It is a shame category theorist must wrap their material in such obtuse language as it seems that it would be just the tool for the job.""
In imperative programming you specify the internal sequence that makes up an operation, in functional programming you are more interested in the high level declarations, compositions and that the constraints on them are satisfied.
This pings right at an interest area of mine. Can you point to any references you know on the subject? Particularly cross-domain morphisms?
I think Wilber's AQAL ontology comes closest to being the most "well defined"[2] but also a little whacky. The cornerstone of the model is differentiation across pronouns. The assertion is perspectives are partitioned across 1st, 2nd, and 3rd person perspectives. So for example, art, ethics, and "truth" are the broad knowledge domains. He takes this further by then saying you can take a 1st/2nd/3rd person perspective on actual 1st/2nd/3rd persons.
[1] http://en.wikipedia.org/wiki/Systems_theory
[2] http://wilber.shambhala.com/html/books/kosmos/excerptC/appen...
It was (and is!) fun and challenging but I had hard time seeing any measurable profits from learning what are and how to use functors, monads etc.
Until recently when I was writing asynchronous communication framework in Python and I was searching for simple solution to sequence actions in this heavily callback-based environment.
Now everything looks so simple... (I am looking at you, monads!)
The bad part is that many people do not know what I am talking about when I try to describe them the design ;)
However, I am curious if python's solution looks ugly (since they don't seem to have a 'do' or 'for' expression that Haskell and Scala have respectively)?
The benefit of realising the monadic behaviour of asynchronous sequencing (which I call "Deferrable#bind!") was that if you had a bunch of nested callbacks, the monad associativity law [2] meant you could replace them with a simple linear sequence of chained bind! calls:
fetch().bind! do |a|
process(a)
end.bind! do |b|
process(b)
end.bind! do |c|
# ...
end
instead of fetch().callback do |a|
process(a).callback do |b|
process(b).callback do |c|
# ...
end
end
end
I find the former a lot more readable, partly because the "end" keywords don't all pile up at the end, and especially if you try and do error handling (in the nested case the error handling ends up in reverse order!).[1] https://github.com/samstokes/deferrable_gratification#bind-f...
They do stuff like this in jQuery, so I can't imagine it's all that difficult in Python.
My initial thought would be to write something analogous to Maybe. You can't pattern match in Python, which is a shame, but you could make it so that foo.bar().baz().quux() will return MaybeResult, which everything involved in the transaction inherits from. MaybeResult might have a "success" variable on it indicating whether it ought to be treated as Nothing. Otherwise, check "result."
This is naive but it gets you a little bit closer to fault-tolerant chaining of interdependent methods. Not as nice as Haskell, obvs. :)
login_action = Write('PASS') >> \
Read('pass') >> \
Guard(lambda v: v['pass'] == 'mysecret') >> \
Write('WELCOME')
register(socket, login_action, on_success=func1, on_error=func2)
Of course you can develop this idea futher: cat = Read('line') >> Write(lambda v: v['line'])
cat.append_action(cat)
register(socket, cat, on_error=handle_error_cb)The real beauty of these concepts is that they are not tied to just one logical thing. They're applicable to callbacks and networking, but then they translate effortlessly to handling errors or early termination or non-determinism.
the above is paraphrasing a recent post.
Particularly, category theory seems to center around abstraction. I think abstraction is essentially the core of CS (but maybe that's just because of SICP) and exceptionally important in everyday programming. Learning this sort of math (along with some related fields like abstract algebra) essentially allows you to unlock a higher level of abstraction.
This can help in two ways. For one, it allows you to write more general code and create extremely useful libraries. The Haskell standard library, naturally, is a great example of this. Additionally, it helps with thinking about conceptually difficult concepts in programming. For example, even just the basic ideas of category theory really helped me to understand and work with non-deterministic programming. Thinking about composing non-deterministic functions, and how these functions behave much like normal functions, made life much easier.
Category theory is one of the more abstract branches of math, so it's no surprise that it lends itself to great programming abstractions. Understanding and using such abstractions in a uniform and systematic way is extremely useful, so I think it's definitely an area that would be beneficial for programmers to study.
It's also fun, but that's another story entirely :).