## superconstraints

A way of inferring instance constraints given an instance.

Suppose you have a class like this:

```haskell
class C a

instance C a => C [a]
```

Normally, given `C [a]`, you cannot obtain `C a`; however, superconstraints allows you to add that capability:

```haskell
class HasSuper (C a) => C a

instance C a => C [a]
makeSuper "C [a]"
```

Then, you can retrieve the superconstraint by doing:

```haskell
case super (Proxy :: Proxy (C [a])) of
  Dict -> ...
```

The superconstraint dictionary will include all of the constraints required by the instance.

### Future Improvements

* Replace the crazy string argument to `makeSuper` with something more sensible