constraints, library, Propose Tags , DependentLiterals.Plugin
cabal install dependent-literals-plugin-



Pseudo-dependently-typed integral literals for Haskell.


This is not an officially supported Google product.


This repository contains several packages implementing pseudo-dependently-typed integral literals in GHC Haskell.

In standard Haskell, integer literals 42 are interpreted under the hood as a call to the Num method fromInteger 42 :: Num a => a. This means the type is determined solely by the context, and any failures of bounds checking can be observed only at runtime. This plugin replaces that mechanism with one that reflects the literal's value to the type level, and allows instances to refine the resulting type and perform type-level bounds checks according to the value of the literal.

For example, given mkVec :: SInt n -> (Fin n -> a) -> Vec n a, mkVec 4 will have type (Fin 4 -> a) -> Vec 4 a, and trying to type-check 4 :: Fin 4 will report a type error saying that 4 is out of range.

Patterns get a similar treatment, too, so case (x :: SInt n) of { 1 -> Just Refl; _ -> Nothing } :: Maybe (n :~: 1) can type-check: the act of matching against 1 proved that the type-level n was equal to 1.