code: func doTypesConflict(type1 Output, type2 Output) bool {
  	if type1, ok := type1.(*List); ok {
  		if type2, ok := type2.(*List); ok {
  			return doTypesConflict(type1.OfType, type2.OfType)
  		}
  		return true
  	}
  	if type2, ok := type2.(*List); ok {
  		if type1, ok := type1.(*List); ok {
  			return doTypesConflict(type1.OfType, type2.OfType)
  		}
  		return true
  	}
  	if type1, ok := type1.(*NonNull); ok {
  		if type2, ok := type2.(*NonNull); ok {
  			return doTypesConflict(type1.OfType, type2.OfType)
  		}
  		return true
  	}
  	if type2, ok := type2.(*NonNull); ok {
  		if type1, ok := type1.(*NonNull); ok {
  			return doTypesConflict(type1.OfType, type2.OfType)
  		}
  		return true
  	}
  	if IsLeafType(type1) || IsLeafType(type2) {
  		return type1 != type2
  	}
  	return false
  }
docs: // Two types conflict if both types could not apply to a value simultaneously.
  // Composite types are ignored as their individual field types will be compared
  // later recursively. However List and Non-Null types must match.