Category theory books are almost certainly not what you want to be looking at. Yes, some things in Haskell are inspired by it; but they're entirely usable wthout, and they're all rather simplified compared to the theory.
Typeclasses, you might want to start with the Typeclassopedia
https://wiki.haskell.org/Typeclassopedia. And understand that it is not general function overloading, and you can get yourself into trouble by trying to treat them as such: types flow "backwards" in Haskell, compared to languages where overloading is common. If all you know about a type is its name, you can't do anything with it. In most OO languages with overloading, you can do anything you want with it and it'll throw an exception if it doesn't support it; in Haskell, the compiler won't let you get away with it at all, it never reaches the point of a runtime exception. Similarly, if you know (Num a), this doesn't mean you can use division; you need to also know (Integral a) to get div, or (Fractional a) to get (/).
One thing that follows from how this interacts with typeclasses is return type polymorphism. Consider that maxBound takes no parameters, and decides what to do based on the type it's used at.