trivial-constraint: Constraints that any type, resp. no type fulfills

[ constraints, gpl, library ] [ Propose Tags ] [ Report a vulnerability ]

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.

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.2.0.0, 0.3.0.0, 0.4.0.0, 0.5.0.0, 0.5.1.0, 0.6.0.0, 0.7.0.0
Dependencies base (>=4.5 && <5) [details]
License GPL-3.0-only
Author Justus Sagemüller
Maintainer jsag@hvl.no
Category Constraints
Home page https://github.com/leftaroundabout/trivial-constraint
Source repo head: git clone git://github.com/leftaroundabout/trivial-constraint.git
Uploaded by leftaroundabout at 2021-05-07T08:36:49Z
Distributions LTSHaskell:0.7.0.0, NixOS:0.7.0.0, Stackage:0.7.0.0
Reverse Dependencies 5 direct, 7 indirect [details]
Downloads 7598 total (15 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2021-05-07 [all 1 reports]