> this is a classic case of not needing more types but needing proper names.
Those are types.
Those are types.
Names are just labels attached to an entity for the purpose of identification and readability, they don't impose meaning.
newtype ArbitrarilyLabeled x = ArbitrarilyLabeled x
forgetLabel :: ArbitrarilyLabeled x -> x
forgetLabel (ArbitrarilyLabeled x) = x
What's the "global meaning" of `ArbitrarilyLabeled`? What control has `forgetLabel` lost?