I've been working on Katharos, a functional programming and concurrency library for Python 3.13+. The idea behind it is simple: absence, errors, effects, and concurrent communication should be explicit, composable values instead of hidden control flow.
As someone intimately familiar with Python and not so much with "algebraic abstractions", I looked at your examples and can't figure out how they work (and why the abstraction is useful).
I think it comes down to some people having a strong aesthetic aversion to imperative programming and the practical value of side effects (including exception bubbling), often manifesting in vain attempts to write 'perfect code'.
Can you focus on mlops and data pipelines at scale as well as locally. I want to incorporate this into PySpark or Ray to be able to have better composition. Also include plugins or something for arbitrary "registers" or extra logging of things like events for observability outside of normal instrumentation like dyantrace
It's probably worth being up front about what your do syntax actually does. A generator is not as general as "do", Python doesn't have call/cc or anything like that. I checked and you (or Claude I guess) do it by rerunning the whole thing each time for things like the list monad which is not something I think anyone would want for anything more than a toy.
I think the idea here is what is the best syntax for writing these type of programs in pythonic zen mode and then simply have the library truly optimize it for the run time. Which basically has to be a distributed compute substrate like pyspark or ray.
The goal is more correctness and fluent declarative readability to get business stuff done better, faster and cheaper
I've been working on Katharos, a functional programming and concurrency library for Python 3.13+. The idea behind it is simple: absence, errors, effects, and concurrent communication should be explicit, composable values instead of hidden control flow.
As someone intimately familiar with Python and not so much with "algebraic abstractions", I looked at your examples and can't figure out how they work (and why the abstraction is useful).
Am I missing something?
I think it comes down to some people having a strong aesthetic aversion to imperative programming and the practical value of side effects (including exception bubbling), often manifesting in vain attempts to write 'perfect code'.
Very nice. Any plans to add algebraic effect handlers to this in the near future?
Would it help if I tell you could start with the big-picture of what it does and what problem solves and then jump the details? Just an idea!
Can you focus on mlops and data pipelines at scale as well as locally. I want to incorporate this into PySpark or Ray to be able to have better composition. Also include plugins or something for arbitrary "registers" or extra logging of things like events for observability outside of normal instrumentation like dyantrace
It's probably worth being up front about what your do syntax actually does. A generator is not as general as "do", Python doesn't have call/cc or anything like that. I checked and you (or Claude I guess) do it by rerunning the whole thing each time for things like the list monad which is not something I think anyone would want for anything more than a toy.
I think the idea here is what is the best syntax for writing these type of programs in pythonic zen mode and then simply have the library truly optimize it for the run time. Which basically has to be a distributed compute substrate like pyspark or ray.
The goal is more correctness and fluent declarative readability to get business stuff done better, faster and cheaper