code: @Override
      protected Optional<TermType> reduceInferredTypes(ImmutableList<Optional<TermType>> argumentTypes) {
          if (argumentTypes.stream().allMatch(Optional::isPresent)) {
              return argumentTypes.stream()
                      .map(Optional::get)
                      .map(t -> (ConcreteNumericRDFDatatype) t)
                      .reduce(ConcreteNumericRDFDatatype::getCommonPropagatedOrSubstitutedType)
                      .map(t -> (TermType) t);
          }
          return Optional.empty();
      }
docs: We only infer a type when all the types of the arguments are known.