Newtype mechanisms are a great way to introduce wrapper-free, global distinctions of “different” instances of the same type. But we can do that on a local level, too, by using type parameters. Consider these two signatures. def mungeIDs(uids: List[String], gids: List[String], oids: List[String]): Magic[String, String, String] def mungeIDsSafely[UID <: String, GID <: String, OID <: String] (uids: List[UID], gids: List[GID], oids: List[OID]): Magic[UID, GID, OID] The second function is a st...