Functional programming 使用埃菲尔试剂的功能合成

Functional programming 使用埃菲尔试剂的功能合成,functional-programming,function-composition,eiffel,Functional Programming,Function Composition,Eiffel,我正在尝试用埃菲尔编程语言来做。通过函数合成,我的意思是创建一个函数,它接受两个函数f(x),g(x),并返回一个函数f(g(x)) 问题是内联代理无法访问本地值。在下面的代码中,f和g是代理中的未知标识符 comp (f: FUNCTION [INTEGER, INTEGER]; g: FUNCTION [INTEGER, INTEGER]) : FUNCTION [INTEGER, INTEGER] do Result := agent (x: INTEGER) :

我正在尝试用埃菲尔编程语言来做。通过函数合成,我的意思是创建一个函数,它接受两个函数f(x),g(x),并返回一个函数f(g(x))

问题是内联代理无法访问本地值。在下面的代码中,f和g是代理中的未知标识符

comp (f: FUNCTION [INTEGER, INTEGER]; g: FUNCTION [INTEGER, INTEGER]) : FUNCTION [INTEGER, INTEGER]
    do
        Result := agent (x: INTEGER) : INTEGER do Result := f(g(x)) end
    end
我怀疑有某种方法可以做到这一点,使用一个代理,它接受一个整数和两个函数参数,然后显式地将f和g传递给该代理,但我不确定


如果有人能提供一些见解,我们将不胜感激。

您可以在内联代理中使用defauts参数。在您的情况下,请尝试:

comp(f: FUNCTION [INTEGER, INTEGER]; g: FUNCTION [INTEGER, INTEGER]):FUNCTION [INTEGER, INTEGER]
    do
        Result := agent (a_f: FUNCTION [INTEGER, INTEGER]; a_g: FUNCTION [INTEGER, INTEGER]; x:INTEGER):INTEGER
                        do
                            Result := a_f(a_g(x))
                        end(f, g, ?)
    end

可以在内联代理中使用defauts参数。在您的情况下,请尝试:

comp(f: FUNCTION [INTEGER, INTEGER]; g: FUNCTION [INTEGER, INTEGER]):FUNCTION [INTEGER, INTEGER]
    do
        Result := agent (a_f: FUNCTION [INTEGER, INTEGER]; a_g: FUNCTION [INTEGER, INTEGER]; x:INTEGER):INTEGER
                        do
                            Result := a_f(a_g(x))
                        end(f, g, ?)
    end