announcements

whilo 2026-06-03T01:55:18.210879Z

🐱 katzen — applied category theory for Clojure A Clojure port of the AlgebraicJulia stack (Catlab / GATlab / AlgebraicPetri / AlgebraicDynamics), now on Clojars under org.replikativ/katzen. What you getGATs via deftheory — types, term constructors, axioms (`ThCategory`, ThMonoid, ThSchema, …) • ACSets — typed relational stores with vector or datahike backends • Schema migrations — Δ-migration as a one-liner; functorial chaining works • Wiring diagrams (UWD/DWD) + oapply operadic composition • Petri nets and reaction networks with mass-action, Hill, Michaelis-Menten rate laws • Optional ansatz alias — Lean-kernel verification of schema morphisms • Optional raster alias — compile dynamics to typed numerics for fast ODE solving How it relates to funcool/cats Different axis. cats gives you Functor / Monad / Applicative as protocols for FP idioms. katzen lets you define whole theories (a category of Clojure programs, a category of Petri nets) and translate between them via morphisms. Links • Repo: https://github.com/replikativ/katzen • Notebooks: https://replikativ.github.io/katzen Feedback, issues, and questions welcome..

4
👏 1
🤯 10
👀 1
💜 1
🎉 4
Ben Sless 2026-06-03T11:40:07.339039Z

I'm going to ask a stupid question - what can I do with it? (practically speaking)

👍 1
whilo 2026-06-04T08:08:43.505289Z

Category theory in general helps to name patterns of hierarchical and higher-level compositions. I have tried to address more use cases in the README, one of them is to translate into string diagrams which there is now also a playground for https://github.com/replikativ/katzen. @ben.sless @droberts3 If you are able to fully formalize your computational domain as a category you get things for free like the operad composition (demonstrated for dynamical systems) and functor translations like the diagram. You can do this also without category, e.g. as simple graphs or hypergraphs, but then you have less standardized terminology and computational notions. Catlab.jl is a research program, so this is a way to learn from Julia, and maybe help in designing DSLs, it does not yet solve fundamental new problems, but I think it is promising, and not represented in the Clojure ecosystem yet.

Ben Sless 2026-06-04T08:24:20.659139Z

Trying to figure out what I can practically do with it (besides write a compiler with verification of equivalent program transformations)

whilo 2026-06-04T08:39:36.164709Z

Composition of ODEs can be annoying for instance. Anything where it is not a simple function you apply, but need things to plug into each other in more structured or nested ways is a good example. Not sure what kind of problems you would like to tackle.

Ahmed Hassan 2026-06-04T15:42:41.567799Z

How can it help me write CRUD applications for line for business problems?

Max 2026-06-04T16:39:57.610929Z

Or rather, what sort of applications would it be helpful in writing?

whilo 2026-06-05T07:16:33.630349Z

I think the best way to think about this is to borrow more complex forms of compositionality, in the same way that you pick Clojure over Python for a CRUD app. It is not about CRUD, that is an implementation detail and many Python developers would ask the same question about Clojure, it is about making it simpler and easier to model the domain at hand (through functional programming with its composition that reduces complexity). I made no claim that you need katzen/category theory in general though, Looking into more theoretical fields like this is a way to borrow more concepts to model domains mathematically, learn as a programmer and express more complex patterns of composition. Most programmers stop at graphs, but graph theory is a fairly low-level and old mathematical field. Category theory tries to capture more mathematics faithfully. And coding assistants know about all that stuff, so it is much easier to learn than it was a few years ago I find.

whilo 2026-06-05T07:21:47.561379Z

Obviously applying a perspective that does not fit your domain, which is often the case, is a massive distraction and rabbit hole, something Clojure is positioned against. This is why I think it is not bad to have this as a library to consider, not the default way to approach every problem.

whilo 2026-06-05T07:26:47.233789Z

Maybe an intuitive way to understand it is to think of it as a systematic way to rename and reorder argument sequences in function composition without having to rewrite all the code, but by applying higher order mappings.