don't drag around as a type arg that which can be expressed as an abstract type