Hi Clinton,
HList has some functions that help with defining something similar: <
https://gist.github.com/aavogt/50d5313c99b7224b62dd>. It might be possible to use less classes to define the replicate/zip/map functions needed (by using more GADTs and type families instead) and end up being allowed to define an instance Control.Category.Category HF.
Your code will be shorter if you make instance heads more general and use equality constraints (~). I mean that the following instance (from my paste) gets selected as long as the first argument to ($) is a function, and no type families are needed:
instance (
a ~
a',
b ~
b')
=> Dollar (
a -> b)
a' b'