@Override
    public boolean equals(Object obj) {
        if (super.equals(obj) &&
                this.returnValue.equals(((FunctionType)obj).returnValue) && 
                this.arguments.size() == ((FunctionType)obj).arguments.size()) {
            for (int i = 0; i < this.arguments.size(); ++i) {
                if (!(this.arguments.get(i).type.equals(
                        ((FunctionType)obj).arguments.get(i).type)))
                    return false;
            }
            return true;
        }
        return false;
    }