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