函数组成
本文关键字:数组 函数 | 更新日期: 2023-09-27 18:19:17
Compose
函数下面。如果f
和g
是返回值的一元函数,那么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; };
。如此:
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
的好方法吗?有人能对此做出改进吗?
这里的问题不是static
方法的使用,而是方法组的使用。当您使用函数名作为表达式而不调用它时,则它是一个方法组,必须经过方法组转换。使用实例方法也会遇到同样的问题。
你遇到的问题是c#不能对方法组进行返回类型推断。使用Compose(IsZero, ModBy2))
需要推断IsZero
和ModBy2
的返回类型,因此此操作失败。
这是c#编译器推理能力的一个已知限制。Eric Lippert写了一篇关于这个特定主题的长篇博客文章,其中详细讨论了这个问题
- http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx