Haskell 9.14.1
OK so GHC 9.14.1 just dropped — well, officially it dropped back in December 2025, but it's still the latest stable compiler in the 9.14 line, and 9.14.2 is sitting in RC as of late July 2026, so this is what you should actually be building with right now. I've been poking at the release notes all morning, and there's real stuff in here — plus a couple of warnings that are going to bite your CI the moment you upgrade. Let's dig in.
The TL;DR
- ✅
SPECIALISEpragmas now accept arbitrary expressions (GHC Proposal 493) - ✅ Visible GADT syntax in GADT data constructors — finally (#25127)
- ✅
-Wincomplete-record-selectorsjoins-Wall(GHC Proposal 516) - ⚠️ Multi-specialisation pragma syntax is deprecated, removal scheduled for 9.18
- ⚠️
OverloadedRecordUpdate'ssetFieldargument order got flipped (Proposal 583) - ⚠️
ScopedTypeVariables+TypeApplicationsno longer implies type applications in patterns — you needTypeAbstractionsnow
SPECIALISE Pragmas Got an Upgrade
This one made me genuinely happy. GHC Proposal 493 means you can finally write things like:
{-# SPECIALISE f @Int False :: Int -> Char #-}
Arbitrary expressions in SPECIALISE pragmas — no more fighting the syntax when you want to specialise on a concrete argument. The flip side: the old "multiple specialisations in one pragma" syntax (comma-separated type signatures) is now deprecated, and the new -Wdeprecated-pragmas warning (on by default in -Wdefault) will tell you exactly what to rewrite.
GADTs Get Prettier
Visible GADT syntax in data constructor declarations. The classic example:
data KindVal a where
K :: forall k. forall (a :: k) -> k -> KindVal a -- now allowed!
Yes, that used to be an error. It isn't anymore. Small change, huge quality-of-life win for anyone writing type-level code.
The Warnings That Will Break Your Build
Here's the "let me check my CI" moment. -Wincomplete-record-selectors is now part of -Wall per GHC Proposal 516. If your library compiles with -Werror, you are going to get failures — and this warning is nastier than it looks because the problem is invisible in the source: a record selector that crashes at runtime when the field is missing. If you hit it, fix the code, or temporarily add -Werror=no-incomplete-record-selectors while you clean up. Also, the old deprecated-type-abstractions warning flag has been removed entirely, and the ScopedTypeVariables + TypeApplications combo no longer enables type applications in patterns — that now always requires TypeAbstractions.
The HasField Flip Nobody Reads About Until It Breaks
GHC Proposal 583 redesigned HasField, and OverloadedRecordUpdate now passes arguments to setField in the flipped order. Old type:
setField :: forall fld a r. r -> a -> r
New type:
setField :: forall fld a r. a -> r -> r
If you hand-rolled setField instances, this is a silent-ish behavior change that your test suite will absolutely catch. The migration guide on the GHC Wiki covers it — read it before you upgrade, not after.
What Else Is In There
Beyond the headline items, 9.14.1 ships the usual across-the-board improvements: compiler and GHCi fixes, WebAssembly backend work, runtime system updates, and a fresh batch of base/ghc-prim/template-haskell library changes. Full details live in the official 9.14.1 release notes in the User's Guide.
Bottom line: upgrade, but budget an hour for the warning fallout and the setField check. Period.