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));
}
}