import java.util.function.Function; abstract class Result { public abstract Result map(Function f); public abstract Result flatMap(Function> f); void simplified(final Result> r, final Result b1) { Result rr = r.flatMap(b1::map); } public static Function, Function, Result>> lift2(final Function> f) { return a -> b -> a.map(f).flatMap(b::map); } public static Function, Function, Result>> lift2a(final Function> f) { return a -> b -> a.map(f).flatMap((Function>) (f1) -> b.map(f1)); } public static Function, Function, Result>> lift2b(final Function> f) { return a -> b -> a.map(f).flatMap(f1 -> b.map(f1)); } public static Function, Function, Result>> lift2c(final Function> f) { return a -> b -> a.map(f).flatMap((Function f1) -> b.map(f1)); } }