> Matthew, after sleeping over my problem I think I've arrived at the solution of creating an instance of Interpret for the function `(->)` category which gets its Language instance from the general category one.
> ...
> But I have problems with:
>ex = lambda (lambda (add (before here) here))

I am not 100%, but I think the issue is you've got some [functional dependencies](https://wiki.haskell.org/Functional_dependencies) in your classes.

First, I would generalize `()` for `Terminal` like this:

class Category k => Terminal k u | k -> u where
it :: a `k` u

The reason I think we can do this is that terminal objects for a category are all *isomorphic*, so we can treat whatever instance we make as uniquely determined.

Also here:

class Terminal k => ConstCat k b where
unitArrow :: b -> (() `k` b)

I don't think you need a `b` parameter for `ConstCat`... instead, I would do:

class Terminal k u => ConstCat k u | k -> u where
unitArrow :: b -> (u `k` b)

In fact, we can generalize `ConstCat k u` and get rid of the `u` parameter.


constArrow :: ConstCat k u => b -> a `k` b
constArrow b = (unitArrow b) . it

So we can just do:

class ConstCat k where
constArrow :: b -> (a `k` b)

Sorry if this doesn't compile... :-(

If you want, we make a repo on github so I can pull your code down. That might be easier for us and others who want to join in to communicate code as things get more complicated.