让f
和g
成为两个单参数函数。 f
之后的合成g
被定义为函数x \mapsto f(g(x))
。
假设程序compose
实现了组合。例如,如果inc
是一个向其参数添加1并且square
平方其参数的过程,
((compose square inc) 6)
评估为49。
解决方案很简单。它看起来非常像它的数学模拟:
(define (compose f g)
(lambda (x) (f (g x))))
Let's test:
(define (square x) (* x x))
(define (inc x) (+ x 1))
((compose square inc) 6)
Output:
49
如何使用C ++实现组合?是否可以像这样编写参数并让函数实现自己?
答案 0 :(得分:5)
是的,语法非常相似:
auto compose = [](auto f, auto g){
return [f,g](auto x){return f(g(x));};
};
auto square = [](auto i){return i * i;};
auto inc = [](auto i){return i + 1;};
compose(square, inc)(6); // result is 49
[](auto arg){}
是泛型lambda ,你可以在cppreference's page on lambdas上阅读更多关于它们(以及非通用lambda)的内容。与具有指定参数类型([](int arg){}
)的lambda不同,它们的行为类似于带有模板化operator()
的仿函数,因此允许在其使用的位置推导出它们的参数类型。
答案 1 :(得分:0)
一个非常简单的实现:
template <class F, class G, class T>
auto compose(F f, G g, T x)
{
return f(g(x));
}
用法:
auto foo(int x)
{
return x + 1;
}
auto bar(int x)
{
return x * 2;
}
auto test()
{
return compose(foo, bar, 24);
}
可以优化它来移动参数。
如果你想要一个foo
和bar
的lambda:
auto compose = [](auto x) { return foo(bar(x)); }
然后:
cout << compose(24);