功能构成

时间:2012-01-03 23:07:05

标签: c# functional-programming

低于Compose功能。如果fg是返回值的一元函数,则Compose(f,g)会返回一个函数,该函数在x上调用时执行等效于f(g(x))

static Func<X, Z> Compose<Z, Y, X>(Func<Y, Z> f,Func<X, Y> g) 
{ return x => f(g(x)); }

这里有几个简单的Func值可以组成:

Func<int, bool> is_zero = x => { return x == 0; };

Func<int, int> mod_by_2 = x => { return x % 2; };

E.g。这有效:

Console.WriteLine(Compose(is_zero, mod_by_2)(4));

但是,如果我改为使用这些等效的静态方法:

static bool IsZero(int n) { return n == 0; }

static int ModBy2(int n) { return n % 2; }

同样的例子不适用于那些。即这会产生编译时错误:

Console.WriteLine(Compose(IsZero, ModBy2)(4));

明确将类型传递给Compose可以解决问题:

Console.WriteLine(Compose<bool, int, int>(IsZero, ModBy2)(4));

有没有写Compose这样它可以在没有显式类型的静态方法上工作?

这是实施Compose的好方法吗?任何人都可以对此进行改进吗?

1 个答案:

答案 0 :(得分:10)

这里的问题不是使用static方法,而是使用方法组。当您使用函数名作为表达式而不调用它时,它是一个方法组,必须通过方法组转换。你会遇到与实例方法完全相同的问题。

您遇到的问题是C#无法对方法组进行返回类型推断。使用Compose(IsZero, ModBy2))要求为IsZeroModBy2推断返回类型,因此此操作失败。

这是C#编译器推理功能的一个已知限制。 Eric Lippert撰写了一篇关于这个特定主题的博客文章,详细介绍了这个问题