ML types.
Actor concurrency.
No GC Pauses.
March is a statically-typed functional language: actors and message passing from the BEAM, algebraic data types from ML, compiled to native binaries through LLVM. Perceus reference counting with in-place reuse means no garbage collector and no pauses, at Rust-like performance. And side effects live in the type as capabilities — so what any module can touch is visible, and auditable across your dependencies.
What makes March different
The right ideas, done right.
Performance
Zero-allocation recursive transforms
FBIP rewrites uniquely-owned data in place, so transforms like this allocate nothing on the reuse path. The functional-style rewrite is automatic; no unsafe code required.
See benchmarks →
Benchmark
tree-transform(depth=20, 100 passes)
After pass 1, March allocates nothing — every node rewritten in-place. 7.5× faster than OCaml. 19× faster than Rust. Apple M-series, --opt 2.
| Language | Median | Allocs/pass |
|---|---|---|
| Elixir (BEAM) | 2580 ms | 2M |
| OCaml (ocamlopt) | 3825 ms | 2M |
| Rust (rustc -O) | 9977 ms | 2M |
| March (FBIP) | 513 ms | 0 ✓ |
← Back
Concurrency
Actor model, typed and isolated
Share-nothing message-passing actors with supervision trees. Accidental shared mutable state is a compile error, not a runtime bug.
Type System
Hindley-Milner inference, ADTs, exhaustive patterns
Types flow without annotation boilerplate. The compiler enforces exhaustive pattern matching — a missing case is a compile error. Generics are monomorphized, no boxing overhead.
Memory
Deterministic memory, no collector.
Perceus reference counting reclaims memory the instant it's no longer used, at a point the compiler picks. Predictable latency, no collector, no pauses. Linear types guarantee file handles, sockets, and connections can't leak or double-free.
Refinement Types
Preconditions an SMT solver proves
Attach a predicate to a type — a range, a bound, a relationship between two arguments. The checker (Z3) reads your if-guards to prove it holds, so the invariant is guaranteed, not defensively re-checked — and the result carries its own proof back out.
Capabilities
Least privilege, scoped to a single file
A module declares exactly the effects it needs — here, read access to one file and nothing else. Reach outside that scope and it's a compile error, and forge audit diffs these across dependencies, so widening authority lands in review, not in production.
Try March
See how March feels to write.
Full playground — no install needed ↗Quick Start
Get started in minutes
One command installs on macOS and Linux.