On understanding types, data abstraction, and polymorphism | Synapse