> 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.

Observe:


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.