interface Eff { B f(A a); } class Disfunction { public static Eff apply(final Eff> cab, final Eff ca) { return bind(cab, f -> compose(a -> f.f(a), ca)); } public static Eff bind(final Eff ma, final Eff> f) { return m -> f.f(ma.f(m)).f(m); } public static Eff compose(final Eff f, final Eff g) { return a -> f.f(g.f(a)); } }