MyNixOS website logo
Description

Singletons and induction over GHC TypeLits.

Singletons and induction schemes over GHC.TypeLits.Nat.

While the TypeLits interface provided by GHC does allow case-analysing the values of the naturals (GHC.TypeLits.natVal), it does not facilitate writing type-safe programs involving that AP, if one were to write:

case natVal (x :: Proxy n) of 0 -> foo x

In the RHS of this pattern match n is equal to 0 but this isn't something GHC can reason about, as this is an ordinary pattern match on an Integer. If the type of foo was Proxy 0 -> ... this wouldn't typecheck and one would have to resort to unsafeCoerce. In order to make GHC infer something like this, natVal needs to return a GADT that includes proofs about the natural number it refers to, such that when pattern matching on that GADT the proofs become available to the typechecker.

This package provides a handful of variants of such GADTs for overcoming this type of issue, as well as functions to do typesafe induction on naturals without resorting to manual GADT unpacking. The most basic form of induction - Peano-style induction (P(0) and P(n) implies P(n + 1)) can be inefficient in practice on large numbers, so this package also provides more efficient binary and arbitrary-base induction schemes.

Metadata

Version

0.1.0.0

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows