// 1987 — 2026 · Haskell Curry · Peyton Jones · Wadler · GHC · pure · lazy · type-classed

Haskell=λ.types

A pure, lazy, functional language designed by committee at Portland in 1987 and named after Haskell Curry. 36 years on it has never had a breakout hit — yet it quietly shaped everyone else: Rust's traits, Swift's protocols, TypeScript's unions, React's useState mental model. Pandoc / Cardano / Standard Chartered run it in production; GHC is still the laboratory of type-system research.

1987Portland · FPCA
committee formed
36 yrsstill evolving
1.0 (1990) → 2010 → GHC 9.10
20k+packages on Hackage
+ Stackage snapshots
12languages it influenced
Rust · Swift · Scala · TS · F#...
map :: (a -> b)data Maybe ado notationtype classforall a. [a]take 10 [1..]IO ()(>>=) :: m a -> (a -> m b)Functor fa %1 -> bQuickCheck{-# LANGUAGE GADTs #-}
scroll
01

What is Haskell

Haskell is a pure-functional, lazy-evaluated, strongly statically typed language designed by committee starting in 1987, with 1.0 in 1990 and named after the logician Haskell Curry. It shares ancestry with ML / OCaml but pushes harder: all side effects in the type system, lazy by default, and type classes giving more polymorphism than OOP.

Pure paradigm

Every function sees only its inputs. Same input → same output, forever. IO is a value, executed by the runtime at mainnot an action, but data describing one.

Lazy evaluation

Expressions are not evaluated until needed. Enables take 10 [1..]10 from an infinite stream — and is also the largest perf-bug surface for newcomers.

Static & strong typed types

Hindley-Milner inference: most functions need no annotation. Type classes + GADTs + type families let the type layer express logical propositions — Rust's traits are a simplification.

GHC = the implementation compiler

For 33 years there is essentially one compiler (GHC, Glasgow), serving both industry and research. Cabal / Stack handle packages, GHCup installs the toolchain — "one spec, one impl, no fork" is the Haskell tradition.

map :: (a -> b) -> [a] -> [b]

How to read it: "map is a function taking an a -> b, then an [a], and returning an [b]." Notice that the type alone tells you what map does — given that signature, the implementation is almost forced. This is Haskell's distinctive workflow: type first, body second.

sum.pyPython
def total(xs):
    s = 0
    for x in xs:
        s += x
    return s

# imperative · untyped · null can sneak in
Sum.hsHaskell
total :: Num a => [a] -> a
total = foldr (+) 0

-- one line · null forbidden by types · auto-polymorphic
-- the Num is a type class constraint
02

History : Timeline

From the 1987 Portland committee meeting to GHC 9.10 in 2026, Haskell has always been simultaneously a research language and an industrial one. The line runs through Wadler's monad papers, Peyton Jones's 30-year GHC stewardship, Cardano's industrial bet, Tweag's Linear Haskell, and ends with SPJ moving to Epic to design Verse.

  1. 1985

    Miranda ships — the pre-history

    David Turner at Kent ships Miranda: lazy, pure, ML-style type inference. The 1980s had too many research languages of this shape (Miranda / Lazy ML / Orwell / Ponder / Alfl). They cross-pollinated heavily but could not share code. Academia realises it needs one standard pure-lazy functional language to teach, paper-share, and build on.

  2. 1987·09

    FPCA Portland — a committee is formed

    At the Functional Programming Languages & Computer Architecture conference in Portland, a group of researchers (Peyton Jones, Wadler, Hudak, Hammond, Augustsson...) form a committee on the spot. The mission: design one unified, open, pure-lazy functional language. They name it after Haskell Curry (combinatory-logic founder, 1900-1982). One of the rare "designed by committee" languages that didn't end in disaster.

  3. 1990

    Haskell 1.0 ships

    The formal 1.0 report appears. Early drafts were called Haskell B (B for Brouwer, the intuitionistic logician), the suffix later dropped. 1.0 already nails the core that survives today: type classes (Wadler's 1989 design), ADTs, pattern matching, lazy evaluation. "One language that teaches compilers, type theory and runs real programs".

  4. 1992

    GHC starts at Glasgow

    Simon Peyton Jones and Will Partain start the Glasgow Haskell Compiler in Glasgow. Begins as a research compiler, becomes the de-facto only implementation — every other compiler (HBC / nhc98 / yhc / UHC) is eclipsed. For the next 30 years, GHC ≈ Haskell.

  5. 1992

    Wadler brings monads in

    Philip Wadler ports Eugenio Moggi's 1989 paper "Notions of Computation and Monads" — a category-theoretic structure — into FP, using it to add IO / state / exceptions / non-determinism to a pure language without breaking referential transparency. Monads become Haskell's signature, and the concept most outsiders misread.

  6. 1998

    Haskell 98 — the first "stable" standard

    The committee freezes a version called Haskell 98: "a citation point for teaching and industry". After yearly revisions, the spec finally stops moving. For 12 years, 1998 → 2010, Haskell 98 is the only public standard — even as GHC pile on extensions behind {-# LANGUAGE ... #-} pragmas.

  7. 2003

    Pandoc · Xmonad — out of academia

    Three projects move Haskell from pure-academic to "someone is actually shipping with this": John MacFarlane's Pandoc (universal document converter, soon an industry default), Xmonad (a tiling WM in <1000 lines), and Darcs (a distributed VCS). The reputation as "a language for small, precise tools" starts here.

  8. 2007·04

    SPJ: "Avoid success at all costs"

    Simon Peyton Jones drops the quote that gets repeated and misread forever: "Avoid success at all costs". The real meaning is not "shun success" — it is "don't sacrifice the research agenda for popularity": keep the freedom to break things, keep the space to experiment with the language. That single line shapes the personality of the whole project.

  9. 2010

    Haskell 2010 standard

    The second standard: folds in the most stable GHC extensions of the prior decade (FFI, empty data decls, hierarchical modules, looser do/if-then-else syntax). "Small steps, slow, stable" — this is the Haskell pace of standardisation. A Haskell 2020 effort was opened but never finalised.

  10. 2014

    Stackage / Stack — finally a sane build

    FPComplete ships Stackage (a coherently-compiled set of packages) and the Stack tool. The "Cabal hell" era ends: dependency hell had been Haskell's biggest onboarding wall, and this is its first industrial fix. The turning point in Haskell's tooling history.

  11. 2017

    Cardano picks Haskell

    Charles Hoskinson founds IOHK / Input Output and builds the Cardano blockchain in Haskell — chosen for "formal-verification friendliness". The first genuinely large commercial bet on Haskell: millions of lines on a production chain, smart contracts in Plutus (a Haskell subset). Whatever you think of Cardano, it puts Haskell on the fintech / crypto map.

  12. 2021

    GHC 9.0 — Linear types in the main line

    GHC 9.0 lands linear types (from Tweag's Linear Haskell paper) in the main compiler. The syntax a %1 -> b says the function must use the argument exactly once — the same theoretical problem Rust's borrow checker solves, with a different implementation. Haskell's type system, once again, lands a feature ahead of mainstream industrial languages.

  13. 2023

    SPJ → Epic Games / Verse

    Simon Peyton Jones retires from Microsoft Research Cambridge (after 22 years) and joins Epic Games to design Verse — a dependently-typed FP language for Fortnite's metaverse. He describes it as "everything I learned from Haskell, in a game engine". Haskell's influence spills outward concretely: not just inheritance through ideas, but the same designer building the next step.

  14. 2024

    GHC 9.10 — appetiser for dependent types

    GHC 9.10 (2024) ships visible forall and stronger type-level abstraction: one step closer to dependent types. Haskell won't become Agda/Idris overnight, but singletons + GADTs + type families already let production code prove "small theorems at the type level". The language is still moving after 36 years.

  15. 2026

    36 years in — still the type-system lab

    Haskell in 2026: no breakout hit, not dead, hasn't changed its personality. Pandoc is still the de-facto markdown converter; Cardano / Standard Chartered / Mercury / Tweag still run huge production Haskell; Pandoc + Stackage + cabal-install just works. It isn't Rust's industrial darling and it isn't Lisp's classroom-only retreat — Haskell is the reference implementation of functional programming, a language that influences everyone without needing to be the breakout.

03

Language Essentials : HaskellAlphabet

The eight cards below are where Haskell differs hardest from everything else: type-signature-first, ADTs + pattern matching, type classes, list comprehensions, Maybe / Either, do notation, laziness, parser combinators. The ninth is "monad — show, don't lecture".

A

:: — type signature first

The first line of a Haskell definition is usually its type, not its code. :: reads "has type". You can often guess the implementation from the type — Haskell is the native tongue of type-driven development.

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs
B

data + pattern matching — ADTs, 20 years before the mainstream

Algebraic data types + pattern matching are Haskell's basic syntax. They predate Rust's enum by 20 years, Swift's enum by 25, TypeScript's discriminated unions by 30.

data Tree a = Leaf | Node (Tree a) a (Tree a)

depth :: Tree a -> Int
depth Leaf         = 0
depth (Node l _ r) = 1 + max (depth l) (depth r)
C

class — type classes

Wadler's 1989 invention. A definition that says "any a works as long as it satisfies X". Rust's trait, Swift's protocol, Scala's implicits, Java 8's default methods are all its descendants.

class Eq a where
  (==) :: a -> a -> Bool

instance Eq Int where
  x == y = primIntEq x y
D

List comprehensions

The syntax is lifted directly from mathematical set-builder notation: { x² | x ∈ ℕ, x < 10 }. Python later copied it, but Haskell is the origin of writing maths-into-code.

primes = sieve [2..]
  where
    sieve (p:xs) =
      p : sieve [x | x <- xs, x `mod` p /= 0]
E

Maybe / Either — no null

"Not found" is encoded as Maybe a, "failed" as Either e a. The type system makes you handle both arms. Tony Hoare's "billion-dollar mistake" never existed in Haskell.

data Maybe a = Nothing | Just a

lookup :: Eq k => k -> [(k,v)] -> Maybe v
lookup _ []          = Nothing
lookup k ((k',v):xs)
  | k == k'  = Just v
  | otherwise = lookup k xs
F

do notation — not just IO

do is syntactic sugar for monads. It is not an "imperative block" — it just makes (>>=) read imperatively. The same do template covers IO, Maybe, State, Parser, List.

main :: IO ()
main = do
  name <- getLine
  putStrLn ("hi, " ++ name)
  writeFile "log" name
G

Lazy evaluation — take 10 [1..]

By default every expression is a thunk, evaluated only when needed. That makes infinite lists / self-referential structures / short-circuit control flow ordinary — but it is also the source mine of perf bugs. Modern Haskell picks strictness deliberately with BangPatterns / StrictData.

fibs :: [Int]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

-- self-reference + laziness
take 10 fibs   -- [0,1,1,2,3,5,8,13,21,34]
H

Parser combinators

No external parser generator (yacc/bison/antlr) needed — parsers are values, combined with functions. Parsec / megaparsec make "a production-grade parser in ≤ 200 lines" the norm. The idea later propagated to nom (Rust), parsy (Python), fp-ts.

number :: Parser Int
number = read <$> some digit

pair :: Parser (Int, Int)
pair = (,) <$> number <* char ','
         <*> number
μ

Monad — show, don't lecture

"What is a monad" has 200 mutually contradicting blog posts. Skip them — read code. The IO block below works whether you call it "imperative" or "monadic". do just makes (>>=) read as sequence; nothing more.

greet :: IO ()
greet = do
  name <- getLine
  putStrLn ("hi, " ++ name)

"What a monad is doesn't matter — what matters is that do makes every "computation in a context" look the same."

04

Why Haskell : WhyHaskell

Haskell isn't trying to outrun C or to be friendlier than Python — it targets "correctness expressed via types". People who pick it in production pick it for one thing: refactors stop scaring you, parallelism is safe, null never existed.

λ

Types tell the truth

Haskell type signatures can't hide side effects: a Int -> Int can do nothing but pure computation. IO must show up in the type. Want to sneak a log in? The type system says no.

add :: Int -> Int -> Int
-- cannot do IO, cannot mutate, cannot throw

"Theorems for free"

The title of Wadler's 1989 paper. When a type is general enough, the type uniquely determines the behaviour: forall a. [a] -> [a] can only be reverse / id / take. The type signature itself proves a theorem. This is Haskell's type-system home run.

reverse :: forall a. [a] -> [a]
-- the type forbids depending on element values

Monads — effects as values

IO / state / exceptions / async / parsing all live under one abstraction (Monad). "Doing IO" isn't an action — it's building an IO value, which the runtime executes at the edge. So pure code and effects share one function without contaminating each other.

readBoth :: IO (String, String)
readBoth = (,) <$> readFile "a"
             <*> readFile "b"

Referential transparency

The same expression yields the same value any time, anywhere. So tests are trivially writable, parallelism is safe by default, refactors don't ship hidden bugs. React's useState mental model and Redux reducers are copies of this property.

-- safe to memoise, safe to parallelise:
sum [1..1000000] -- always 500000500000

GHC — research compiler and industrial compiler

GHC has been both a 30-year type-system research lab (linear types, type families, GADTs, dependent-type precursors) and the production compiler behind Pandoc / Cardano. Few languages stand on both legs.

-- the same compiler runs:
-- · a dependent-typed PhD thesis
-- · Standard Chartered's exotic derivatives book
05

Who's Using : ProductionUsers

The Haskell user list is short but each entry carries weight. Pandoc is the de-facto markdown converter; Cardano runs millions of lines of Haskell on chain; Standard Chartered's derivatives book is arguably the world's largest commercial Haskell codebase. Meta uses Haxl for anti-abuse; GitHub uses Semantic for code parsing.

06

What Haskell Shaped : TheRipple

This is the heart of the page: Haskell never had a breakout hit, but the concepts it pioneered now live inside every modern language — much of what you write today in Rust / Swift / TypeScript / React is 1990s Haskell research with a new name.

"

Our design philosophy is "Avoid success at all costs" — not "run from success", but "don't sacrifice the freedom to experiment for mass adoption". Haskell isn't a product; it's a research language. That identity is what let us run the type-system experiments nobody else dared to run for 30 years.

— Simon Peyton JonesGHC lead for 30+ years · MSR Cambridge · now Epic Games / Verse · paraphrased from interviews
12
Features now in mainstream languages

Type classes → Rust trait / Swift protocol / Scala implicit; ADTs + pattern match → Rust enum, Swift enum, TS union; list comprehensions → Python; lambdas → Java 8; Hindley-Milner inference → the entire ML family + TS / Swift; lazy streams → Java Stream / C# IEnumerable. The list keeps going.

30+ yr
GHC, 30+ years as type-system lab

Since 1992 GHC has been the accepted main stage of type-system research. GADTs (2007), Type families (2008), Data kinds (2012), Type-in-type (2016), Linear types (2021), Visible forall (2024) — each feature lands as an ICFP / POPL paper first, in GHC months later. No other language matches the cadence.

3 labs
Industrial Haskell strongholds

Standard Chartered (Strats / Mu, derivatives), IOHK / Cardano (blockchain), Tweag (consulting + Linear Haskell). Together they run tens of millions of lines of production Haskell, and their annual stability patches to GHC are a pillar of the ecosystem's health.

What Haskell influenced — 12 of the most direct lines
Rust
trait
type class lifted directly, renamed trait
Swift
protocol
Protocol-Oriented Programming = type class
Scala
implicit / given
implicit params are type class instances
TypeScript
HKT discussions
fp-ts ports monad/functor to TS
F#
ML/Haskell hybrid
functional on .NET · workflow = monad
OCaml
mutual
sibling ML descendant · mutual exchange
PureScript
direct descendant
Haskell syntax · compiles to JS · strict
Elm
simplified Haskell
FP for web · ancestor of Redux mental model
React / Redux
mental model
useState / reducer = pure function
Java 8+
lambda + Stream
Wadler also designed GJ → Java generics
Idris / Agda
dependent-type successors
pushing Haskell types to the limit
Verse (Epic)
2023 · SPJ
SPJ's own phrasing: "everything I learned from Haskell"
SPJ → VERSE

SPJ joins Epic Games (2023)

In 2023 Simon Peyton Jones retired from Microsoft Research Cambridge and joined Epic Games to design Verse — a dependently-typed FP language for Fortnite's metaverse. His own description: "everything I learned from Haskell, in one game engine".

This is the most concrete evidence of Haskell's reach: not just successors copying ideas, but the same person carrying 30 years of research directly into a new ecosystem. Verse runs in Unreal Editor for Fortnite (UEFN); millions of players already use scripts written in it — FP is closer to end-users than at any point before.

"Avoid success at all costs" sounds ironic 36 years on — but SPJ's answer with Verse is: the point was never to avoid success, only to refuse the market's pull. 30 years of experimentation, now poured into a ten-million-user ecosystem.

-- Haskell (1990 →)
map :: (a -> b) -> [a] -> [b]

-- Rust (2015 →)
fn map<A, B, F>(xs: Vec<A>, f: F)
  -> Vec<B>
  where F: Fn(A) -> B

-- Swift (2014 →)
func map<A, B>(_ xs: [A],
  _ f: (A) -> B) -> [B]

-- Verse (2023 →, SPJ)
Map(xs: []A, f: A -> B) : []B

-- the type signature literally travelled
-- 33 years across 4 languages

2026 toolchain / ecosystem

GHC
Glasgow Haskell Compiler
GHCup
Toolchain installer
cabal-install
Official package manager
Stack
Curated build over Stackage
Stackage
Coherent package snapshots
HLS
Haskell Language Server
hlint
Linter
ormolu
Standard formatter
QuickCheck
Property-based testing · original
hspec / tasty
Test frameworks
megaparsec
Modern parser combinators
optparse-app
Applicative-style CLI args
aeson
Fastest JSON library
text / bytestring
Efficient string types
lens
Record / data access DSL
servant
Type-level HTTP API DSL

In one line: Haskell never won the market, yet won every successor. Rust's traits, Swift's protocols, TS's unions, React's useState — basically every modern feature you'd point to was already discussed in a 1995 Haskell paper. That is its victory, and its place.

07

vs ML family : Haskell vs OCaml vs F#

Three ML-family languages people confuse. Haskell: pure-lazy, type classes. OCaml: strict, strong module system, Jane Street's language (not Haskell — common confusion). F#: an OCaml/Haskell hybrid on .NET.

HaskellOCamlF#
OriginFPCA committee · 1987INRIA · 1996 (Caml 1985)Microsoft · 2005
EvaluationLazy by defaultStrict (opt-in lazy)Strict
PurityPure-by-force · IO in typesside effects mixed in expressionsside effects allowed
Polymorphismtype classes · ad-hoc + parametricparametric · modules/functors as substitutetype classes (partial) + .NET interfaces
Primary usersPandoc · Cardano · Standard Chartered · Meta · MercuryJane Street · MirageOS · Coq · early Rust compilerFinance · .NET back ends · data science
CompilerGHC (near-monopoly)ocamloptdotnet · F# project
Type inferenceFull HM · optional annotationsFull HM · module signatures requiredHM · hints near .NET interop
ConcurrencySTM · async · GHC RTSDomains (OCaml 5) · effect handlersasync · MailboxProcessor
ToolchainGHCup · cabal · stack · HLSopam · dune · merlindotnet · paket · Ionide
SyntaxIndent + offside · minimalKeyword-heavy (let/in/end)Indent · ML + .NET flavour
CommunityResearch + industry · paper-heavyPragmatic industry · Jane Street cultureThe .NET-mainstream alternative
08

Outlook : TheRoadAhead

Haskell in 2026 is no longer trying to win the market — the open questions are: how far do dependent types reach; how to untangle the record / string legacy; who carries GHC after SPJ's generation. Every question is about "how does a research language keep doing research" — none about "how to break out".

OPEN · 2026+

Dependent types — how far, how fast

Haskell has been walking a narrow path of "approach Idris / Agda but don't become them": GADTs (2007) → TypeFamilies (2008) → DataKinds (2012) → singletons → visible forall (2024). Each step adds "things you can do at the type level" without shattering the syntax.

The 2026 state: practical dependent types are one step away — you can already prove small theorems in the type system ("these two vectors are the same length"), but not whole Coq-class proofs. The roadmap is open; the pace is set by the post-SPJ core team.

GADTs + TypeFamilies (2024)70%
full dependent types (the path)100%
RECORDS

Records — the forever pain point

One Haskell legacy wart: record field names are top-level functions, so two records can't share a field name. The community has lived on RecordWildCards / OverloadedRecordDot / lenses to cope. 2023's OverloadedRecordDot finally made foo.bar work in GHC — twenty years after TS / Swift. The price of "small steps, slow, stable".

STRING

Strings — old joke, new fix

The other running joke: Haskell has three stringsString (= [Char], a linked list, slow), Text (UTF-16, compact, recommended), ByteString (byte array, for IO). Every library picks which it accepts; conversion is a beginner's first cliff. 2024's OsString adds a platform-aware fourth — "slower, more careful" still applies.

OUTLOOK

"Influence everyone, don't be the breakout"

Haskell in 2026 doesn't need to win: type classes are already living inside Rust / Swift, FP mental models inside React / Redux, parser combinators inside nom / parsy, and there are a hundred blog posts on monads. Whatever it had to spread, it already spread.

What's left is clear: keep GHC running as a type-system laboratory, keep Pandoc / Cardano / Standard Chartered and their kin happy. "Avoid success at all costs" was a joke in 2007; 36 years on it has literally come true — and the patient is doing fine.