Perhaps what you need is not a programming language like Haskell, but a
proof assistant like Agda, where you can express arbitrary categories.
A limited form of this is possible in Haskell as well, but the lack of
dependent types would force you through a lot of boilerplate and heavy
value/type/kind lifting.