lawful-0.1.0.0: README.md
# lawful: Assert that your typeclass instances are lawful
## What is this package for?
This small library provides a single two-parameter typeclass `Lawful c t`,
where `c` is a typeclass and `t` is a type. Declaring an instance of
`Lawful C T` is an assertion that "the instance for `C T` obeys the laws of
the class `C` (whatever *that* means!)"
For example, a lawful instance of `Eq T` should satisfy the reflexive
law `x == x` for all `x :: T`. This is certainly true for most types, such
as `Int` or `[a]` when `Eq a` is lawful, so we can define
```haskell
Lawful Eq Int
Lawful Eq a => Lawful Eq [a]
```
But it *isn't* true for `Double`:
```
λ> nan = 0 / 0 :: Double
λ> nan == nan
False
```
## Why is there a `c t` constraint on `Lawful c t`?
This constraint lets you use a `Lawful c t` wherever a `c t` would be expected,
as in:
```haskell
same :: Lawful Eq a => a -> a -> Bool
same x y = x == y
```
## How do I know what laws are expected from a typeclass?
If everybody more-or-less agrees on what the right laws are, hopefully they bothered to
write them down somewhere. If they didn't, then sorry! You're on your own!
## Shouldn't all typeclass instances be lawful anyway, making this package useless?
Wouldn't that be nice?