This document describes a list of upcoming/proposed changes to Haskell core/de facto libraries.
- Ongoing: the change is already rolled out.
- Upcoming: the change is made upstream, and will be released in near future.
- Planned: the change has been approved by the committee. Implementation is not necessaryly available
- Summary:
Word{8,16,32}
are now defined in terms of the corresponding primitive types instead ofWord#
. - Reason: Small word types used to store
Word#
inside, making record types containing them space-inefficient. - Since: GHC 9.2
- Breakage: major
- Proposal: https://ghc-proposals.readthedocs.io/en/latest/proposals/0074-small-primitives.html
- Merge request: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4390
- How to fix: insert
word*ToWord*
(https://hackage.haskell.org/package/ghc-prim-0.8.0/docs/GHC-Prim.html#v:word8ToWord-35-) conditionally (cf. Fix build on GHC 9.2 by josephcsible · Pull Request #354 · haskell-crypto/cryptonite) using CPP
- Summary:
Control.Monad.Trans.List
is gone - Reason:
ListT
is a monad only if the underlying monad is commutative; therefore it is not a valid monad transformer. - ETA: GHC 9.4 / transformers-0.6
- Expected breakage: medium
- Tracking issue: https://hub.darcs.net/ross/transformers/issue/75
- Patch: https://hub.darcs.net/ross/transformers/patch/7c809b6f9db019ed761c971d10c86fa004f60d89
- How to fix: remove instance declarations for transformer's
ListT
(deprecated). Users should switch to lawful alternatives such as pipes.
- Summary:
Control.Monad.Trans.Error
is removed in favour ofControl.Monad.Trans.Except
. - Reason:
ErrorT
imposes an Error constraint, making it difficult to use as a general-purposeEither
transformer. - ETA: GHC 9.4 / transformers-0.6
- Expected breakage: medium
- Tracking issue: N/A
- Patch: https://hub.darcs.net/ross/transformers/patch/7c809b6f9db019ed761c971d10c86fa004f60d89
- How to fix: remove instance declarations for
ErrorT
and switch toExceptT
- Summary: Foldable/Traversable-polymorphic functions in Data.List get specialised to
[]
- Reason: There's a custom importing
Data.List
unqualified, making additions likesingleton
anduncons
controversial. Making the list API monomorphic and encouraging to import it qualified make it more consistent with other container modules. - ETA: GHC 9.6 / base-4.18?
- Proposal: https://groups.google.com/g/haskell-core-libraries/c/q3zHLmzBa5E/m/OrHHKaJNAQAJ?pli=1
- Tracking issue: #20025
- Merge request: !5304 https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5107
- Expected breakage: significant
- Relevant warnings:
-Wcompat-unqualified-imports
(implied by -Wcompat) - How to fix: import
Data.List
qualified or explicitly import functions that don't conflict with Foldable/Traversable variants
- Summary: 'forall' will become a keyword at the term level
- Reason: Making Type-level and term-level syntax more consistent is a way forward to introduce dependent types
- Proposal: Visible 'forall' in types of terms
- ETA: GHC 9.10?
- Tracking issue: N/A
- Merge request: N/A
- Expected breakage: minor (authors of the affected packages were notified)
- Relevant warnings:
-Wforall-identifier
(introduced and enabled by default in GHC 9.4) - How to fix: Rename identifiers
- Summary: return gets removed from the Monad class and becomes a top-level function defined as
return = pure
- Reason: Now that Monad is a subclass of Applicative,
return
is completely redundant (it doesn't make sense ifreturn
is notpure
). - Proposal: GHC wiki: monad-of-no-return, related: Enable -Wnoncanonical-monad-instances and -Wnoncanonical-monoid-instances by default
- ETA: Unknown
- Tracking issue: N/A
- Merge request: N/A
- Expected breakage: minor (canonical definition of
return
will be ignored) - Relevant warnings:
-Wnoncanonical-monad-instances
(enabled by default as of GHC 9.2) - How to fix: Remove definitions of return (compatible up to GHC 7.10)
- Summary: mappend gets removed from the Monoid class and becomes a top-level function defined as
mappend = (<>)
- Reason: Since
Semigroup
is a superclass ofMonoid
,mappend
does not have to be defined. - Proposal: GHC wiki: semigroup-monoid, related: Enable -Wnoncanonical-monad-instances and -Wnoncanonical-monoid-instances by default
- ETA: Unknown
- Tracking issue: N/A
- Merge request: N/A
- Expected breakage: major (without an update to the warning)
- Relevant warnings:
-Wnoncanonical-monoid-instances
(enabled by default as of GHC 9.2) - How to fix: Remove definitions of mappend (compatible up to GHC 8.4)
- TODO: make
-Wnoncanonical-monoid-instances
warn manual declarations ofmappend
- Summary: (/=) gets removed from the Eq class and becomes a top-level function defined as
a /= b = not (a == b)
- Reason: The only valid semantics of
x /= y
isnot (x == y)
; unlikecompare
vs(<=)
, there's no room for any performance improvements. - Proposal: haskell/core-libraries-committee#3
- ETA: Unknown
- Tracking issue: N/A
- Merge request: N/A
- Expected breakage: 131 packages according to the proposal
- How to fix: Remove definitions of
(/=)
(backward-compatible)
- Summary:
*
will no longer be parsed as a kind of value types (Type
). - Reason: Special treatment to
*
complicates the syntax and prevents the use of it as a type operator. - Proposal: ghc-proposals/ghc-proposals#143
- ETA: Unknown
- Tracking issue: N/A
- Merge request: N/A
- Expected breakage: medium
- Relevant warnings:
-Wstar-is-type
- How to fix: Replace
*
withType
(fromData.Kind
)
- deprecation-mechanisms/type-class-methods (not implemented; it would be nice to have method deprecation)
- Warnings and sanity-checking
- Approved core library proposals
- Accepted GHC proposals
- GHC Boot Library Version History: useful for updating version constraints