I am working through Bartosz Milewski's Category Theory for Programmers, and in many examples and problems he will say something like "Show that PreList is a bifunctor." While it is clear how something like List acts on objects, and there is a very obvious choice of how it should act on morphisms, is there only one such choice?
It seems to me that a problem like "is C++'s std::map a bifunctor" is either extremely underspecified, or requires the seemingly very difficult task of proving that there is no mapping of morphisms which renders it a bifunctor. What am I misunderstanding?
When people don't specify the action on morphisms explicitly it means they think there is an obvious one. It does not mean there is only one such choice. When an operation on objects is defined by some sequence of functorial operations, if those operations are composable, then there is an obvious action on morphisms as well, because composing functors yield functors. For example, one might define $$\operatorname{List} X = 1 + X + X^2 + X^3 + \cdots$$ but since coproduct and product are functorial operations, this formula serves to define a functor on both objects and morphisms.