1. Record the state machine's status at the type level.
2. Achieve composable state machines through type composition.
Practical Effects of Polystate
1. Define the program's overall behavior through compositional declarations. This means we gain the ability to specify the program's overall behavior at the type level. This significantly improves the correctness of imperative program structures. This programming style also encourages us to redesign the program's state from the perspective of types and composition, thereby enhancing code composability.
2. Build complex state machines by composing simple states. For the first time, we can achieve semantic-level code reuse through type composition. In other words, we have found a way to express semantic-level code reuse at the type level. This approach achieves three effects simultaneously: conciseness, correctness, and safety.
3. Automatically generate state diagrams. Since the program's overall behavior is determined by declarations, polystate can automatically generate state diagrams. Users can intuitively understand the program's overall behavior through these diagrams.
noelwelsh · 17m ago
I'm guessing you're not a native English speaker. Your descriptions could use some work. A few examples:
"For the first time, we can achieve semantic-level code reuse through type composition." is, to me, mostly meaningless. This almost certainly isn't the first time someone has done whatever it is you are claiming. What is *semantic-level" code reuse? Calling a library function is code reuse, and I expect that function to have the same semantics every time I call it. Why is type composition necessary to achieve this?
"Define the program's overall behavior through compositional declarations. This means we gain the ability to specify the program's overall behavior at the type level." How does the specifying behavior at the type level follow from composition? I can use composition, at the value level, just fine without types (e.g. in Javascript).
goless · 1m ago
Yes the expression may not be precise enough, but the example should be accurate enough.
Yes, this effect can be achieved without using composite types. But if it is convenient and easy to achieve this effect through composite types, is it worth it?
loa_in_ · 7m ago
It makes perfect sense if one considers the whole description and the field of computer sciences. It reads more like an overview that an explanation and I guess that's too be expected from any project in it's pre-mature stages of development. IMO it reads just fine, but it should delve deeper into the matter after the introduction.
2. I don't seem to see the possibility of combining state machines
chrisweekly · 6h ago
Looks interesting.
Note the README repeats a typo, twice, "ploystate" - the 1st two references to the package name. You'll def want to fix that pronto, it reduces confidence in quality of do s.
goless · 6h ago
Fixed, thanks for your reminder!!
goless · 8h ago
Hi everyone, I developed an interesting library Polystate: Composable Finite State Machines
Since I only have experience in haskell and zig, I'm curious if there are other languages or libraries with similar implementations?
I believe that FSMs are a very powerful approach, even for building entire systems. So much so, that it forms a core part of our product.
goless · 4h ago
Yes, FSMs are underestimated in imperative programming. Of course this is probably because before type-safe state machines were available, manual coding was very error-prone.
_0ffh · 2h ago
I've seen them a lot in embedded programming, but I can't be sure if that observation holds in general or just for the environment in which I was working when I did embedded.
solomonb · 7h ago
I'm having trouble reading zig code, so I'm not sure how much overlap there is but I have done some work with mealy and moore encoded as co-algebras in haskell:
Right on, I'll take a look at your haskell code this week.
crq-yml · 5h ago
Typically it's done through source code generation or a runtime interpreter - state machine systems implementing a "DSL->source code" mechanism have been around for nearly as long as high level languages, and by taking this approach they have a lot of freedom to include compiler techniques of their choosing. If dynamism is called for then the diagram is typically kept in memory and interpreted at runtime.
Doing it through types is intellectually interesting and makes the result more integrated into the edit-compile loop instead of involving a step in the build process or a step of invoking an interpreter, but it might not change the practical state of the art.
goless · 4h ago
Yes, but their expressiveness may vary. An important role of polystate is code reuse. It can express more complex states and still be type-safe.
goless · 7h ago
It relies heavily on compile-time evaluation of zig to achieve this, and I'm not sure if the same effect can be achieved in other languages.
ur-whale · 1h ago
> Hi everyone, I developed an interesting library Polystate
A short blurb on the github explaining what applications this may have and how you would use it to solve problems would be very helpful.
jasonthorsness · 6h ago
The automatic diagrams are great. Almost worth using a library like this just for that, since then you know the diagram actually reflects the implementation.
goless · 6h ago
Yes, all my examples have state diagrams, they are automatically generated and are an effective way for me to understand the structure of the program.
tcoff91 · 5h ago
Looks kind of like a Zig version of XState, a typescript library that I really have enjoyed using.
goless · 4h ago
I don't know much about XState but it looks more like a dynamically interpreted execution state machine.
1. Record the state machine's status at the type level.
2. Achieve composable state machines through type composition.
Practical Effects of Polystate
1. Define the program's overall behavior through compositional declarations. This means we gain the ability to specify the program's overall behavior at the type level. This significantly improves the correctness of imperative program structures. This programming style also encourages us to redesign the program's state from the perspective of types and composition, thereby enhancing code composability.
2. Build complex state machines by composing simple states. For the first time, we can achieve semantic-level code reuse through type composition. In other words, we have found a way to express semantic-level code reuse at the type level. This approach achieves three effects simultaneously: conciseness, correctness, and safety.
3. Automatically generate state diagrams. Since the program's overall behavior is determined by declarations, polystate can automatically generate state diagrams. Users can intuitively understand the program's overall behavior through these diagrams.
"For the first time, we can achieve semantic-level code reuse through type composition." is, to me, mostly meaningless. This almost certainly isn't the first time someone has done whatever it is you are claiming. What is *semantic-level" code reuse? Calling a library function is code reuse, and I expect that function to have the same semantics every time I call it. Why is type composition necessary to achieve this?
"Define the program's overall behavior through compositional declarations. This means we gain the ability to specify the program's overall behavior at the type level." How does the specifying behavior at the type level follow from composition? I can use composition, at the value level, just fine without types (e.g. in Javascript).
1, https://github.com/sdzx-1/polystate?tab=readme-ov-file#2-imp...
This shows what composition means, and even complex nested selects are described quite precisely by type.
2, https://github.com/sdzx-1/polystate?tab=readme-ov-file#1-com...
Yes, this effect can be achieved without using composite types. But if it is convenient and easy to achieve this effect through composite types, is it worth it?
https://news.ycombinator.com/item?id=44353478
I have two questions here:
1. How to express uncertain state in type. In my example, it is implemented by union (enum) + Witness https://github.com/sdzx-1/polystate-examples/blob/fecaffb5b7...
2. I don't seem to see the possibility of combining state machines
Note the README repeats a typo, twice, "ploystate" - the 1st two references to the package name. You'll def want to fix that pronto, it reduces confidence in quality of do s.
Since I only have experience in haskell and zig, I'm curious if there are other languages or libraries with similar implementations?
https://medium.com/@paul_42036/entity-workflows-for-event-dr...
I believe that FSMs are a very powerful approach, even for building entire systems. So much so, that it forms a core part of our product.
https://blog.cofree.coffee/2025-03-05-chat-bots-revisited/ https://github.com/cofree-coffee/cofree-bot
Also using the lens library to encode moore machines as polynomial functors: https://blog.cofree.coffee/2024-07-02-lensy-moore/
I have a raw haskell prototype of polystate here, maybe it will help you. https://github.com/sdzx-1/typed-gui/blob/main/examples/todoL...
Doing it through types is intellectually interesting and makes the result more integrated into the edit-compile loop instead of involving a step in the build process or a step of invoking an interpreter, but it might not change the practical state of the art.
A short blurb on the github explaining what applications this may have and how you would use it to solve problems would be very helpful.