ghc-typelits-knownnat
Derive KnownNat constraints from other KnownNat constraints
| LTS Haskell 24.18: | 0.7.13 | 
| Stackage Nightly 2025-11-03: | 0.8.2 | 
| Latest on Hackage: | 0.8.2 | 
ghc-typelits-knownnat-0.8.2@sha256:6e9ef33bd2cf462e7d66f5b28608c0156007947b3a7a95fd5b90bfa4a0365d1e,5993Module documentation for 0.8.2
- GHC
- GHC.TypeLits
 
 
ghc-typelits-knownnat
A type checker plugin for GHC that can derive “complex” KnownNat
constraints from other simple/variable KnownNat constraints. i.e. without this
plugin, you must have both a KnownNat n and a KnownNat (n+2) constraint in
the type signature of the following function:
f :: forall n . (KnownNat n, KnownNat (n+2)) => Proxy n -> Integer
f _ = natVal (Proxy :: Proxy n) + natVal (Proxy :: Proxy (n+2))
Using the plugin you can omit the KnownNat (n+2) constraint:
f :: forall n . KnownNat n => Proxy n -> Integer
f _ = natVal (Proxy :: Proxy n) + natVal (Proxy :: Proxy (n+2))
The plugin can derive KnownNat constraints for types consisting of:
- Type variables, when there is a corresponding 
KnownNatconstraint - Type-level naturals
 - Applications of the arithmetic expression: 
{+,-,*,^} - Type functions, when there is either:
- a matching given 
KnownNatconstraint; or - a corresponding 
KnownNat<N>instance for the type function 
 - a matching given 
 
To elaborate the latter points, given the type family Min:
type family Min (a :: Nat) (b :: Nat) :: Nat where
  Min 0 b = 0
  Min a b = If (a <=? b) a b
the plugin can derive a KnownNat (Min x y + 1) constraint given only a
KnownNat (Min x y) constraint:
g :: forall x y . (KnownNat (Min x y)) => Proxy x -> Proxy y -> Integer
g _ _ = natVal (Proxy :: Proxy (Min x y + 1))
And, given the type family Max:
type family Max (a :: Nat) (b :: Nat) :: Nat where
  Max 0 b = b
  Max a b = If (a <=? b) b a
and corresponding KnownNat2 instance:
instance (KnownNat a, KnownNat b) => KnownNat2 "TestFunctions.Max" a b where
  natSing2 = let x = natVal (Proxy @a)
                 y = natVal (Proxy @b)
                 z = max x y
             in  SNatKn z
  {-# INLINE natSing2 #-}
the plugin can derive a KnownNat (Max x y + 1) constraint given only a
KnownNat x and KnownNat y constraint:
h :: forall x y . (KnownNat x, KnownNat y) => Proxy x -> Proxy y -> Integer
h _ _ = natVal (Proxy :: Proxy (Max x y + 1))
To use the plugin, add the
OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver
Pragma to the header of your file.
Changes
Changelog for the ghc-typelits-knownnat package
0.8.2 October 17th 2025
- Fix -fdefer-type-errors regression
 
0.8.1 October 10th 2025
- Fix #53 The plugin sometimes doesn’t look through type aliases
 - Fix #13 Type equality constraints aren’t used by solver
 - Fix #42 Intermediate type variable stops derivation of 
KnownNatconstraint 
0.8.0 September 8th 2025
- Support for GHC 9.14.1.
 - Drop support for GHC 8.0, 8.2, 8.4, 8.6.
 
0.7.13 March 4th 2025
- Support for GHC 9.12.1
 
0.7.12 May 22nd, 2024
- Support for GHC 9.10.1
 
0.7.11
- Fix infinite loop between plugin and solver pipeline
 
0.7.10 November 14th 2023
- Work around GHC issue 23109
 
0.7.9 October 10th 2023
- Support for GHC 9.8.1
 
0.7.8 February 20th 2023
- Support for GHC-9.6.0.20230210
 
0.7.7 October 10th 2022
- Add support for GHC 9.4
 
0.7.6 June 18th 2021
- Add support for GHC 9.2.0.20210422
 
0.7.5 February 10th 2021
- Raise upper limit for TH dep to allow building on ghc-9.0.1
 
0.7.4 January 1st 2021
- Add support for GHC 9.0.1-rc1
 
0.7.3 July 25th 2020
0.7.2 February 6th 2020
- Add support for GHC 8.10.0-alpha2
 
0.7.1 October 8th 2019
0.7 August 26th 2018
- Solve “known” type-level Booleans, also inside 
If(GHC 8.6+) 
0.6 September 14th 2018
- Move 
KnownNat2instances forDivandModfromghc-typelits-extratoghc-typelits-knownnat 
0.5 May 9th 2018
- Fix Inferred constraint is too strong #19
 
0.4.2 April 15th 2018
- Add support for GHC 8.5.20180306
 
0.4.1 March 17th, 2018
- Add support for GHC 8.4.1
 
0.4 January 4th, 2018
- Add partial GHC 8.4.1-alpha1 support
 - Drop 
singletonsdependency #15KnownNatNclasses no longer have theKnownNatFNassociated type family
 
0.3.1 August 17th 2017
- Fix testsuite for GHC 8.2.1
 
0.3 May 15th 2017
- GHC 8.2.1 support: Underlying representation for 
KnownNatin GHC 8.2 isNatural, meaning users of this plugin will need to update their code to useNaturalfor GHC 8.2 as well. 
0.2.4 April 10th 2017
- New features:
 
0.2.3 January 15th 2017
- Solve normalised literal constraints, i.e.:
KnownNat (((addrSize + 1) - (addrSize - 1))) ~ KnownNat 2
 
0.2.2 September 29th 2016
- New features:
- Derive smaller constraints from larger constraints when they differ by a single variable, i.e. 
KnownNat (a + b), KnownNat bimpliesKnownNat a. 
 - Derive smaller constraints from larger constraints when they differ by a single variable, i.e. 
 
0.2.1 August 19th 2016
- Fixes bugs:
- Source location of derived wanted constraints is, erroneously, always set to line 1, column 1
 
 
0.2 August 17th 2016
- New features:
- Handle 
GHC.TypeLits.- - Handle custom, user-defined, type-level operations
 - Thanks to Gabor Greif (@ggreif): derive smaller from larger constraints, i.e. 
KnownNat (n+1)impliesKnownNat n 
 - Handle 
 
0.1.2
- New features: Solve “complex” KnownNat constraints involving arbitrary type-functions, as long as there is a given KnownNat constraint for this type functions.
 
0.1.1 August 11th 2016
- Fixes bug: panic on a non-given KnownNat constraint variable
 
0.1 August 10th 2016
- Initial release