return a tuple (new_self, new_other) such that
        new_self == self, new_other == other, and new_self.field == new_other.field

def join(self, other):
        '''return a tuple (new_self, new_other) such that
        new_self == self, new_other == other, and new_self.field == new_other.field '''
        if self.field == other.field:
            return self, other

        _, f1, f2 = Constructible.join_fields(self.field, other.field)
        return f1(self), f2(other)