need constraint for type system