It should be pretty clear from all the examples in groups, rings, and modules that two categories and are isomorphic if there are functors and so that is the identity functor on and is the identity functor on .
Unfortunately, that’s not really as useful as it is in more mundane structures. The problem is that isomorphism is really strict, and categories are more naturally sort of loose and free-flowing. We have to weaken the notion of isomorphism to get something really useful. I’ll try to motivate this with one example. It’s sort of simple, but it gets to the heart of the problem pretty quickly.
Remember the category with one object and its identity morphism. We draw it as , taking the identity as given. Let’s also consider a category with two objects and two non-identity morphisms, one going in either direction: . Call the objects and , and the four arrows , , , , where goes from to . Then we have and . That is, the two non-identity arrows are inverses to each other, and the two objects are thus isomorphic.
Now since the two objects in our toy category are isomorphic, they are “essentially the same”. The category should (and does) behave pretty much the same as the category , but they’re clearly not isomorphic as categories.
Here’s another way they’re “the same” category. Since each hom-set in our toy category has at most one object, we can consider it as a preorder. We have the set with and in the order. If we (as usual) move to a partial order, we identify these two points and just get the unique partial order on one point — the category !
Okay, so if they’re not isomorphic, what are they? The key here is that the two objects in our toy category are isomorphic, but not identical. The definition of isomorphism of categories requires that (for example) is exactly again. But really should it matter if we don’t get back itself, but just an object isomorphic to it? Not really. And we also shouldn’t care if we get different results for every object in as long as they’re all isomorphic to the object we stick into , and as long as these isomorphisms all fit together nicely with morphisms between the objects.
The upshot of all this is that we do know how to weaken the concept of isomorphism of categories: we just change the functor equalities in the definition to natural isomorphisms of functors! That is, we have natural isomorphisms and . Let’s unpack this all for our toy category.
The functor from to is the only one possible: send both objects to the single object in and all the arrows to its identity. For a functor the other way we have two choices. Let’s send the singlt object of to the object . The identity arrow must then go to . Now we need natural isomorphisms.
To find these, let’s write down the compositions explicitly: sends the single object of to the object in our toy category, which then gets sent back to the single object in . Its identity arrow just comes along for the ride. Thus is exactly the identity functor on , so we can just use its identity natural transformation as our .
On the other hand, sends both objects of our toy category to the object , and all four arrows to the identity arrow . This is clearly not the identity functor on our category, so we need to find a natural isomorphism. That is, we need to find isomorphisms and so that the two nontrivial naturality squares commute. Clearly we can only pick and . Now if we write out the naturality squares for and (do it!) we see that they do commute, so is a natural isomorphism.
When we have two functors running back and forth between two categories so that their composites are naturally isomorphic to the respective identities like this, we say that they furnish an “equivalence”, and that the categories are “equivalent”. Every isomorphism of categories is clearly an equivalence, but there are many examples of categories which are equivalent but not isomorphic. This is a much more natural notion than isomorphism for saying categories are “essentially the same”.