public override IExpression Specialize(IEnumerable <Type> allowedTypes) { var unified = Types.SpecializeTo(allowedTypes); if (unified == null) { return(null); } var isFormAb = formAB.UnifyAll(unified) != null; var isFormCd = formCD.UnifyAll(unified) != null; if (isFormAb && isFormCd) { return(new EitherFunc(unified)); // Can't make a decision yet } if (isFormAb) { return(Funcs.Const.Specialize(unified)); } if (isFormCd) { return(Funcs.ConstRight.Specialize(unified)); } return(null); }