MyNixOS website logo
Description

Constraints that any type, resp. no type fulfills.

Since GHC 7.4, constraints are first-class: we have the constraint kind, and thus type-classes have a kind of form k -> Constraint, or k -> l -> m -> ... -> Constraint for a multi-param type class. Such type-level functions can be used as arguments to data types, or as instances for other type classes.

For any given arity, the constraint-valued functions form a semigroup with respect to “constraint intersection”, which Haskell supports with tuple syntax, e.g.

type NewCstrt¹ a = (Cstrt¹₀ a, Cstrt¹₁ a)

means that NewCstrt¹ :: * -> Constraint requires that for any given parameter both Cstrt¹₀ and Cstrt¹₁ be fulfilled. It is intuitive enough that this type-level semigroup can be extended to a monoid, but out of the box this is only possible for arity 0, i.e. for Cstrt⁰ :: Constraint

(Cstrt⁰, ()) ~ ((), Cstrt⁰) ~ Cstrt⁰

For higher arity, this would require type-level lambdas, like for Cstrt² :: * -> * -> Constraint

(Cstrt², \a b -> ()) ~ (\a b -> (), Cstrt²) ~ Cstrt²

which is not valid Haskell syntax. It is easy enough to define the lambdas in an ad-hoc manner as

type Unconstrained² a b = ()

and then

(Cstrt², Unconstrained²) ~ (Unconstrained², Cstrt²) ~ Cstrt²

This library provides those trivial constraints in a single, documented place, and it uses classes instead of type-synonyms (which would be problematic when it comes to partial application). Arities 0-9 are provided.

They can be useful in any construction that is parameterised over a constrainer-class, when you do not wish to actually constrain the domain with it.

The other thing this library provides are the opposite classes, i.e. \a b ... -> Impossible, constraints which can never be fulfilled. They are essentially dual to the Unconstrained ones, and can likewise be useful as parameters that should completely “disable” a conditional feature.

Metadata

Version

0.7.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