# trivial-constraint: 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.

Versions [faq] | 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 |
---|---|

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 Fri Jul 12 10:06:12 UTC 2019 |

Distributions | NixOS:0.6.0.0 |

Downloads | 2265 total (208 in the last 30 days) |

Rating | (no votes yet) [estimated by rule of succession] |

Your Rating | |

Status | Docs available [build log] Last success reported on 2019-07-12 [all 1 reports] |

## Downloads

- trivial-constraint-0.6.0.0.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)