Функциональная композиция

Под функцией 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 ? Может ли кто-нибудь внести в это улучшения?

9
задан dharmatech 3 January 2012 в 23:07
поделиться