using System.Collections.Generic;
using System.Threading.Tasks;
public static async Task Main()
Console.WriteLine(await FutureApplicative.LiftA2(Task.FromResult(10), FutureApplicative.Pure(20), (a, b) => a*b));
public static class FutureApplicative
public static Task<A> Pure<A>(A a) => Task.FromResult(a);
public static async Task<C> LiftA2<A, B, C>(Task<A> ta, Task<B> tb, Func<A, B, C> map2)
await Task.WhenAll(ta, tb);
return map2(ta.Result, tb.Result);