ML & FP Family — Tier 3 Index

ML & FP Languages — Tier 3 Index

  • Type: language-family-index
  • Family: ML descendants + extended functional programming
  • Languages catalogued: 21
  • Last updated: 2026-05-07

Family overview

The ML family began with Robin Milner’s Meta Language for the LCF theorem prover (1973) and gave the world Hindley-Milner type inference, algebraic data types, pattern matching, and parametric polymorphism — the toolkit every modern statically-typed FP language now uses. Branches diverged into Standard ML (academic, eagerly evaluated), the Caml lineage (OCaml, F#), Haskell (lazy, pure), and a long tail of research/teaching languages exploring uniqueness types (Clean), dependent types (Idris, ATS), algebraic effects (Eff, Koka), and content-addressed code (Unison). You’ll encounter ML-family languages in compiler internals, theorem provers, financial DSLs, formal-methods tooling, and increasingly in front-end web (Elm, PureScript, ReScript). The unifying thread is let the type system catch real bugs at compile time without ceremony — most ML descendants get away with no annotations through inference.

In our deep library

  • haskell — Pure lazy FP with type classes; the de facto “research-grade” FP language since 1990.
  • ocaml — Strict ML with objects, modules, and a fast native compiler; powers Jane Street, Coq, Flow.
  • fsharp — OCaml on .NET with computation expressions; Microsoft’s official FP language.
  • roc — Modern strict pure FP with platform-based effects; Elm-influenced syntax, no GC by default.
  • gleam — Statically-typed BEAM language with ML-like syntax; FP for Erlang/OTP.
  • idris — Dependently-typed FP with quantitative type theory (Idris 2 since 2020).

Tier 3 — the family

LanguageFirst releaseStatus (2026)Niche / use caseWhy it mattersSource
Standard ML (SML)1983 (DefSML 1990, revised 1997)Active (academic)Compiler courses, formal semanticsThe first language with a complete formal definition; SML/NJ, MLton, Poly/ML and MLKit are still maintainedhttps://smlfamily.github.io
Caml Light1990Defunct (superseded by OCaml ~1996)Historical / teachingINRIA’s bytecode interpreter; INRIA dropped it for OCaml — still used in some French CS curriculahttps://caml.inria.fr/caml-light/
Mercury1995Active (slow-moving)Logic + functional + typesProlog descendant with strong static modes/types/determinism; used by Prince XML and YesLogichttps://mercurylang.org
Curry1996Active (academic)Functional + logic hybridHaskell syntax with non-deterministic search and free variables; PAKCS and KiCS2 are live implementationshttps://www.curry-lang.org
Clean1987ActivePure FP with uniqueness typesPioneered uniqueness/linear-type-style ownership in 1987 — direct intellectual ancestor of Rust’s borrow checkerhttps://clean.cs.ru.nl
PureScript2013ActiveHaskell-shaped language for JSStrict by default (vs Haskell’s laziness); row polymorphism for records; popular for Halogen/React-style frontendshttps://www.purescript.org
Elm2012Active (slow release cadence)Pure FP for the frontend”No runtime exceptions” — designed-out failure modes; Roc’s syntax descends directly from ithttps://elm-lang.org
ReScript2020 (renamed from BuckleScript)ActiveOCaml-shaped JS/TS replacementCompiles a curly-brace-flavored OCaml to readable JS; Facebook origins; ReasonML’s modern incarnationhttps://rescript-lang.org
Frege2011MaintenanceHaskell-on-JVMImplements Haskell 2010 with JVM interop; still works but development largely stalledhttps://github.com/Frege/frege
Eta2017Defunct (last release 2019)Haskell-on-JVM via GHC forkForked GHC 7.10 to target JVM; ambitious but ran out of funding; instructive cautionary tale for compiler forkshttps://eta-lang.org
Idris 12009SupersededPredecessor to Idris 2Pioneered self-hosting dependently-typed compilation; Idris 2 (covered in deep library) replaces it on Chez backendhttps://www.idris-lang.org/old/
ATS2007Active (research)Systems programming with dependent + linear typesCompiles to C; combines proof obligations with low-level pointer arithmetic — used in OS and embedded researchhttps://www.ats-lang.org
Granule2018Active (research)Graded modal typesTracks resource usage in the type system (linearity, security, sensitivity) via a graded modalityhttps://granule-project.github.io
Helium2002MaintenanceHaskell teaching subsetStripped-down Haskell with dramatically improved error messages — designed for first-year FP courses at Utrechthttps://www.cs.uu.nl/wiki/Helium
Hope1980Defunct (historical)Early FP teaching languageEdinburgh-era language that introduced algebraic data types as a primary feature; precursor to Miranda/Haskellhttps://en.wikipedia.org/wiki/Hope_(programming_language)
Miranda1985Defunct (commercial)Lazy FP precursor to HaskellDavid Turner’s commercial lazy FP; its design directly motivated the 1987 Haskell committeehttps://www.cs.kent.ac.uk/people/staff/dat/miranda/
Eff2012Active (research)Algebraic effects laboratoryAndrej Bauer’s effect-handler language; predates Koka and influenced OCaml 5’s effect handlershttps://www.eff-lang.org
Koka2012Active (Microsoft Research)Algebraic effects + ref countingDaan Leijen’s effect-typed language with Perceus reference counting; effect rows tracked per functionhttps://koka-lang.org
Unison2020 (1.0)Active and growingContent-addressed FP for distributed systemsFunctions stored by hash, not name — eliminates dependency conflicts; novel “abilities” effect system; Cloud platform shipped 2024https://www.unison-lang.org
Lean 42021Active and growingTheorem prover + general-purpose FPSelf-hosted dependently-typed language; mathlib4 community is the largest formalized math project everhttps://lean-lang.org
Haxe2005ActiveCross-platform FP-leaning languageCompiles to JS, C++, C#, Java, Python, Lua, HashLink; FP-flavored with macros; backbone of Dead Cells, Northgard, Papers Pleasehttps://haxe.org

Notes adjacent to the table (context, not full rows)

  • Liquid Haskell — refinement-type extension to GHC; covered in the deep haskell note. Mentioned here because it represents the “refinement types as a plugin” lineage that ATS/Granule explore as first-class language features.
  • Squiggol / Bird-Meertens formalism — not a language but a calculational notation for deriving FP programs; foundational to Haskell’s idioms (fold, map, scan algebra) and worth knowing if you’re reading 80s/90s FP papers.
  • Disciple — ML-family research language from Ben Lippmeier (DDC compiler) with explicit effect and region annotations; influential on later effect-system designs but not in active production use.

Notable threads

Strict vs lazy split. Standard ML, OCaml, F#, Roc, Gleam, Elm, PureScript, and most Tier-3 ML descendants are strict (eager evaluation). Haskell, Miranda, and Frege are lazy. The lazy camp earned reputation for elegance (infinite lists, Hughes’ “Why FP Matters” stream-fusion arguments) but laziness exacts a cost in space-leak debugging and predictable performance — every strict ML-family language ships with explicit lazy / thunk types when laziness is wanted, and that’s increasingly the consensus design.

Effect systems as the new frontier. The 2010s-2020s wave of FP research has converged on effect typing rather than monadic-IO-as-default. Eff and Koka pioneered handlers as language primitives; Unison’s “abilities” generalize the same idea; OCaml 5 (2022) and Roc both ship effect handlers as part of the runtime. This is the most significant shift in FP language design since type classes — it lets you write generic code that abstracts over IO/state/exceptions without the monad-transformer ergonomics tax. Watch this space: Haskell’s effectful, Scala’s gears, and Roc’s platform model are all converging on similar shapes.

Linearity, uniqueness, and the road to Rust. Clean (1987) introduced uniqueness types — the constraint that a value has exactly one reference and can therefore be mutated in place safely. ATS extended this with linear types for systems programming. Granule generalized it to graded modalities. Rust’s borrow checker is the same idea repackaged for an imperative-feeling syntax with no GC. The intellectual lineage Clean → ATS → Rust → linear-types-Haskell (2020) is one of the more striking cross-paradigm transfers in language history.

Frontend web as ML’s beachhead. Elm (2012), PureScript (2013), ReScript (2020), and increasingly Roc target the browser. The pitch is uniform: Hindley-Milner inference catches the kind of type errors that JavaScript’s undefined is not a function would have shipped to production. None has displaced TypeScript at the volume layer — but each owns a corner where teams are willing to trade ecosystem size for type safety. Worth tracking: Roc’s bet is that the same value proposition extends to backend platforms, not just the browser.

Citations