Sotto una funzione Compose
. Se f
e g
sono funzioni unarie che restituiscono valori, quindi Compose(f,g)
restituisce una funzione che quando viene chiamata su x
esegue l'equivalente a f(g(x))
.Composizione funzione
static Func<X, Z> Compose<Z, Y, X>(Func<Y, Z> f,Func<X, Y> g)
{ return x => f(g(x)); }
Ecco un paio di semplici Func
valori che può essere composto da:
Func<int, bool> is_zero = x => { return x == 0; };
Func<int, int> mod_by_2 = x => { return x % 2; };
Ad es questo funziona:
Console.WriteLine(Compose(is_zero, mod_by_2)(4));
Tuttavia, se invece ho questi metodi statici equivalenti:
static bool IsZero(int n) { return n == 0; }
static int ModBy2(int n) { return n % 2; }
stesso esempio non funziona con quelli. Cioè questo produce un errore di compilazione:
Console.WriteLine(Compose(IsZero, ModBy2)(4));
tipi in modo esplicito che passano a Compose
corregge il problema:
Console.WriteLine(Compose<bool, int, int>(IsZero, ModBy2)(4));
Esiste un modo per scrivere Compose
tale che funziona sui metodi statici senza i tipi espliciti?
È un buon approccio da adottare per implementare Compose
? Qualcuno può apportare miglioramenti a questo?
rigidità C# 's nel trattamento dei tipi di funzione/delegato è una cosa che mi ha sempre frustrato rispetto a anatra linguaggi tipografici come JavaScript. –