dependent-literals-plugin
Version 0.1.0.1 revision 3 uploaded by AndrewPritchard.
Package meta
- Synopsis
- Dependent integer literals
- Description
This plugin implements pseudo-dependently-typed integer literals.
This means the value of an integer literal is available at the type level, and can be used for things like validation or type inference. For example, the SInt instance refines unknown type-level Nat variables to the particular literal value, and the Fin instance emits compile-time errors for out-of-range values. So, 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-check4 :: Fin 4
will report a type error saying that4
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-leveln
was equal to 1, so Refl can type-check asn :~: 1
.To use this, enable the extensions
DataKinds
,FlexibleContexts
,ViewPatterns
, andTypeApplications
, adddependent-literals
anddependent-literals-plugin
to your package's dependencies, and add-fplugin=DependentLiterals.Plugin
toghc-options
to enable the plugin globally, or useOPTIONS_GHC
pragmas to enable the plugin on a per-module basis. "Normal" integral types should still behave as normal, but literals and numeric patterns will become supported for SInt and Fin, and will provide additional information to the type checker automatically.- Author
- Andrew Pritchard <awpr@google.com>
- Bug reports
- https://github.com/google/hs-dependent-literals/issues
- Category
- Constraints
- Copyright
- 2019-2021 Google LLC
- Homepage
- https://github.com/google/hs-dependent-literals#readme
- Maintainer
- Andrew Pritchard <awpr@google.com>
- Package URL
- n/a
- Stability
- n/a