Skip to content

Algebraic Effect Systems

A research survey of algebraic effects across theory, language design, compiler/runtime implementation, and production libraries.

Last reviewed: February 16, 2026.


Scope

This section focuses on algebraic effects and handlers (operations + handlers + resumptions), plus adjacent systems that heavily influence practical adoption:

  • effect systems without full handlers (for comparison)
  • capability systems that overlap with effect tracking
  • runtime proposals that make handlers efficient (for example, stack switching and delimited continuations)

What Is an Algebraic Effect System?

At the core, an algebraic effect system has three ingredients:

  1. Operations representing abstract effects (get, put, choose, raise, ...)
  2. Handlers interpreting those operations
  3. Resumptions (continuations) that let a handler continue, alter, duplicate, or abort the rest of the computation

This gives modular effectful code: programs describe what effects they need, handlers decide how they run.


State of the Art (2026 Snapshot)

The frontier is no longer a single "best library". It is a set of converging advances along different axes:

AxisCurrent Frontier
SemanticsSound treatment of higher-order effects and handler interactions (e.g. Hefty Algebras and follow-up work)
CompilationEvidence-passing and selective continuation capture; O(1) dispatch for common operations
Runtime supportNative continuation support in major runtimes (OCaml 5, GHC delimited continuation primops, WebAssembly stack-switching proposal work)
ParallelismFirst formal systems and implementations for parallel algebraic handlers (lambda^p)
AdoptionIndustrial use of effect-inspired systems in Haskell, Scala, OCaml, and TypeScript ecosystems

No ecosystem currently dominates every axis at once.


Encoding Taxonomy

By Effect Representation Strategy

StrategyDescriptionLibraries / Languages
Free monadEffects as data; computation tree built then interpretedpolysemy, freer-simple
Carrier fusionHigher-order functors fused at compile time via typeclass instancesfused-effects
ReaderT IOConcrete IO monad with extensible environment; effects dispatched via IORefeffectful, cleff, bluefin
Delimited continuationsNative stack capture via GHC primops; effects handled by resumable promptseff, bluefin-algae
Hefty algebrasSeparation of first-order and higher-order effect elaborationheftia
Fiber runtimeLightweight green threads with structured concurrencyZIO, Cats Effect
Row-polymorphic effectsEffects tracked via extensible row types with scoped labels and full inferenceKoka, Eff
Native continuationsOne-shot delimited continuations built into the language runtimeOCaml 5
Capability passingEffects accessed via value-level or context-level capability tokensbluefin, [Scala 3 capabilities], Ox
Generator-basedEffects encoded via generator functions yielding effect descriptorsEffect (TypeScript)
Wasm continuationsTyped stack switching primitives at the bytecode levelWasmFX

By Type-Level Effect Tracking

ApproachMechanismLibraries / Languages
Type-level listEff (es :: [Effect]) a with Member / :> constraintseffectful, cleff, polysemy, fused-effects
Fixed type parametersZIO[R, E, A] with intersection types for environmentZIO
Typeclass hierarchySync, Async, Concurrent etc. constraining F[_]Cats Effect
Value-level handlesST-like scoped type variables on handle valuesbluefin
Capture checkingExperimental ^{cap} annotations tracking capability captureScala 3 (Caprese)
Row typesExtensible row types with effect labels; full effect inferenceKoka, Eff
UntypedEffects are values at runtime; no static typing of effect setsOCaml 5
Ambient abilitiesEffects as ambient abilities in scope; handler determines availabilityFrank, Unison
Three-parameter typeEffect<A, E, R> encoding success, error, and requirementsEffect (TypeScript)

Note: systems marked as having "no effect tracking" (Rust implicit features, Java Loom) are covered in individual pages but omitted from the taxonomy since they do not implement effect-system abstractions.


Quick Navigation

History and Synthesis

Haskell

Scala

Effect-Native / Runtime-Native

Other Ecosystems


High-Confidence Milestones

  • 2009: Plotkin and Pretnar formalize handlers of algebraic effects.
  • 2014-2017: Koka demonstrates practical row-polymorphic effect typing and efficient compilation strategies.
  • 2020-2021: Evidence-passing compilation gives strong performance and a clean semantic account.
  • 2021: OCaml effect handlers are retrofitted into an industrial language runtime (PLDI).
  • 2023: Hefty Algebras clarifies modular, sound higher-order effect elaboration.
  • 2023: WasmFX presents typed continuations for WebAssembly as a general target for non-local control.
  • 2024-2025: Parallel handlers, affine/linearity-aware systems, and abstract effect algebra frameworks expand the theory frontier.

Notes on Terminology

  • Algebraic effects: usually first-order operations interpreted by handlers.
  • Higher-order effects: operations that take computations/continuations as arguments (for example, local, catch, scoped resources).
  • Effect system vs effect handlers: many production systems track effects but do not support full algebraic handlers.

Sources