c#中的部分函数应用程序,具有更改的绑定变量

时间:2015-03-24 10:40:53

标签: c# lambda functional-programming

我在使用更改绑定变量正确设计部分函数应用程序时遇到问题。

想象一下,我有一些平衡方程式

f(x_1,...,x_n)=0

然后我把除了x_k(k改变!)之外的所有变量放在那里,得到函数

g(x_k)=f(x_1=X_1,...,x_k,...,x_n=X_n)

然后我把它放在一些解算器中并获得x_k的解决方案。只需几行代码即可:

Func<double,double,double> f;
Func<double,double> g;
f = (x,y) => x - y;
g = (z) => f(10,z); // hier is the binding of the 1-st parameter hard-coded,
//but must be some way to choose which parameter to bind
double solution = solve(g);

在某种程度上,我需要传递一个长度为n-1的数组,数字k以释放并在运行中构建一个新函数g。你会怎么做?

P.S。如果可能的话,n也应该是可变的,但是,根据我的理解,这将是代码/设计复杂性的一个重大飞跃。如果您对此有强烈意见,请验证我的理解。

1 个答案:

答案 0 :(得分:1)

原油,但只是一个想法的种子:

Func<int,double,double> g;
g = (i,z) => (i==0) ? f(10,z) : (i==1) ? f(z,10) : etc

更灵活,更复杂的建议:

Func<double[],double> f;
Func<int[],double[],double> g;
g = (i,d) => f(i.Select( x => d[x]).ToArray());

介于两者之间:

Func<int,double,double[],double> g;
g = (k,c,d) => f(d.Select( (i,x) => (i!=k) ? x : c).ToArray());