anchor.diff:        });
       }
     }
  +  
  +  void equalConstraint(TypeIdentifier a, TypeIdentifier b){
  +    subsetConstraint(a, b);
  +    subsetConstraint(b, a);
  +  }
  +  
  +  void subsetConstraint(TypeIdentifier a, TypeIdentifier b) {
  +    if (a != b)
  +      foreach(a).update((AbstractType type) => types.put(b, type));
  +  }
   }
   
   
  
positive.code:       .update((AbstractType func) {
          if (func is FunctionType) {
            for (var i = 0; i < paramIdents.normalParameterTypes.length;i++)
              _subsetConstraint(func.normalParameterTypes[i], paramIdents.normalParameterTypes[i]);
            for (var i = 0; i < func.optionalParameterTypes.length;i++)
              _subsetConstraint(func.normalParameterTypes[i], paramIdents.normalParameterTypes[i]);
            
            for(Name name in func.namedParameterTypes.keys){
              _subsetConstraint(func.namedParameterTypes[name], paramIdents.namedParameterTypes[name]);
            }
            _subsetConstraint(func.returnType, returnIdent);
          }
       });
    }
  
negative.code:     if (!elementAnalysis.containsElement(node) && elementAnalysis.elements[node] is ReturnElement)
        engine.errors.addError(new EngineError("A ExpressionFunctionBody was visited, but didn't have a associated ReturnElement.", source.source, node.offset, node.length ), true);
      ReturnElement returnElement = elementAnalysis.elements[node];
      subsetConstraint(new ExpressionTypeIdentifier(node.expression), new ReturnTypeIdentifier(returnElement.function));
    }
    
    
  