Currying in C#

Func<A, Func<B, C>> Carry<A, B, C>(Func<A, B, C> f) {
    return a => b => f(a, b);
}

Func<intintint> avg = (a, b) => (a + b)/2;
var n1 = avg(1, 3);
//n1 is 2

var avg1 = Carry(avg)(1);
//avg1 is avg func with first param = 1
var n2 = avg1(3);
//n is 2 = (1 + 3)/2