-- a `isTypeCompatible` b iff a can be substituted for b
isTypeCompatible :: Type -> Type -> Bool
(PrimitiveType nameA)         `isTypeCompatible` (PrimitiveType nameB)         = nameA == nameB
isTypeCompatible :: Type -> Type -> Bool
(PrimitiveType nameA)         `isTypeCompatible` (PrimitiveType nameB)         = nameA == nameB
(PrimitiveType nameA)         `isTypeCompatible` (PrimitiveType nameB)         = nameA == nameB