(PolymorphicType nameA varsA) `isTypeCompatible` (PolymorphicType nameB varsB) = 
    nameA        == nameB             &&
    length varsA == length varsB      && 
    all (\(a, b) -> a `isTypeCompatible` b) (zip varsA varsB)
(PolymorphicType nameA varsA) `isTypeCompatible` (PolymorphicType nameB varsB) = 
    nameA        == nameB             &&
    length varsA == length varsB      && 
    all (\(a, b) -> a `isTypeCompatible` b) (zip varsA varsB)
(PolymorphicType nameA varsA) `isTypeCompatible` (PolymorphicType nameB varsB) = 
    nameA        == nameB             &&
    length varsA == length varsB      && 
    all (\(a, b) -> a `isTypeCompatible` b) (zip varsA varsB)