Free modules: bases when you can get them
A free module is one with a basis: a generating set that is also R-linearly independent. Equivalently F ≅ ⨁ᵢ R, a direct sum of copies of R. Free modules are the closest thing to vector spaces, and they enjoy the universal property that defines bases everywhere: a map out of a free module is determined freely by where the basis goes. Over a field every module is free (that's just the basis theorem), but over Z the module Z/2Z is not free — it has torsion, and free modules over a domain are torsion-free.
Projective and injective: lifting and extending
P is projective if every surjection onto P splits — equivalently, every map out of P lifts along any surjection: given M ↠ N and P → N, there is P → M making the triangle commute. The cleanest characterization: P is projective iff it is a direct summand of a free module. Every free module is projective; the converse can fail. Over a PID (or any local ring) projective and free coincide, which is why projectivity rarely surfaces in a first course — it needs rings rougher than Z.
Dualize every arrow and you get injective: I is injective if every map into I extends — given an injection A ↪ B and a map A → I, it extends to B → I. The dual of “summand of a free” is harder to picture, but Baer's criterion makes injectivity testable: I is injective iff every map from an ideal a → I extends to R → I. Over Z, injective = divisible: Q and Q/Z are the standard injective Z-modules.
Flat: tensoring without damage
The functor M ⊗_R – (see the tensor product) always preserves surjections but can destroy injections. M is flat if tensoring with M preserves injections too — i.e., M ⊗_R – is exact. Free ⟹ projective ⟹ flat, and none of the arrows reverses in general. Over a PID, flat ⟺ torsion-free, which gives a one-line test.
Why Z/2Z is NOT flat over Z — a tensor that kills an injection. Start with the injection f : Z -> Z, f(x) = 2x. (multiplication by 2) It is injective: 2x = 0 in Z forces x = 0. Apply - (x)_Z Z/2Z to the whole map. Using Z (x) Z/2Z = Z/2Z: f (x) id : Z/2Z -> Z/2Z becomes [a] |-> [2a] = [0]. So the tensored map is the ZERO map on Z/2Z. But the original f was INJECTIVE and the tensored map is NOT (its kernel is all of Z/2Z). Tensoring with Z/2Z broke injectivity => Z/2Z is not flat. Consistent with: over a PID, flat = torsion-free, and Z/2Z is all torsion. Meanwhile Q IS flat over Z (it is torsion-free); tensoring with Q is exact -- this is just "localization," passing to rational scalars.