using System.Collections.Generic;
public static void Main(string[] args)
var tempsInF = new List<int>{45,54,65,23,44,78,90,55 };
Func<int, double> FahrenheitToCelsius = new Func<int, double>(x => x - 32).Compose(x => x*5.0/9.0);
Func<int,double, double> average = (count,sum)=>sum/count;
var results = tempsInF.Filter(x => x > 50).Map(FahrenheitToCelsius).Apply(x=> average(x.Count,x.Reduce((y, z) => y + z, 0.0)));
Console.WriteLine(results);
public static class HighOrder
public static X Head<X>(this List<X> list)
public static List<X> Tail<X>(this List<X> list)
return list.Skip(1).ToList();
public static Func<X, Z> Compose<X, Y, Z>(this Func<X, Y> f, Func<Y,Z> g)
public static List<T> Filter<T>(this List<T> list, Func<T, bool> predicate)
return list.Where(predicate).ToList();
public static List<Y> Map<X,Y>(this List<X> list, Func<X, Y> predicate)
return list.Select(predicate).ToList();
public static Y Apply<X, Y>(this X obj, Func<X, Y> function)
public static Y Reduce<X, Y>(this List<X> list, Func<X, Y, Y> predicate, Y accumulator)
var current = accumulator;
foreach (X element in list)
current = predicate(element, current);
public static Func<Y> Partial<X, Y>(this Func<X, Y> function, X arg)
return () => function(arg);
public static Func<Y, Z> Partial<X, Y, Z>(this Func<X, Y, Z> function, X arg1)
return arg2 => function(arg1, arg2);