using System.Collections.Generic;
public static void Main()
var range = Enumerable.Range(1, 10);
Console.WriteLine(EnumerableFunctor.Map(range, x => x).SequenceEqual(range));
int? nullableNull = null;
Console.WriteLine(NullableFunctor.Map(nullableTen, x => x) == nullableTen);
Console.WriteLine(NullableFunctor.Map(nullableNull, x => x) == nullableNull);
public static class EnumerableFunctor
public static IEnumerable<B> Map<A, B>(IEnumerable<A> source, Func<A, B> map) =>
public static class NullableFunctor
public static B? Map<A, B>(A? source, Func<A, B> map) where A : struct where B : struct =>
source is A notNullSource ? map(notNullSource) : default(B?);