Java monad (almost)
interface Functor<A> { <B> Functor<B> map(Function<A, B> f); } interface Monad<A, M extends Monad> extends Functor<A> { <B> Monad<B, M> bind(Function<A, M> f); } interface Maybe<A> extends Monad<A, Maybe> { static <A> Maybe<A> point(final A a) { return a == null ? Nothing : new Just<>(a); } class Just<A> implements Maybe<A> { public final A a; public Just(A a) { this.a = a; } @Override public <B> Maybe<B> map(final Function<A, B> f) { return point(f.apply(a)); } @Override public <B> Maybe<B> bind(final Function<A, Maybe> f) { //should be Maybe<B> but can't typed in Java return f.apply(a); } } Maybe Nothing = new Maybe() { @Override public Maybe bind(Function f) { return Nothing; } @Override public Maybe map(final Function f) { return Nothing; } }; }
J8SKY
public interface Fn<A, B> { B apply(A a); static <X> Fn<X, X> I() { return x -> x; } // Kxy = x static <X, Y> Fn<X, Fn<Y, X>> K() { return x -> y -> x; } // Sxyz = xz(yz) static <X, Y, Z> Fn<Fn<Z, Fn<Y, X>>, Fn<Fn<Z, Y>, Fn<Z, X>>> S() { return x -> y -> z -> x.apply(z).apply(y.apply(z)); } // Yf=f(Yf) interface Y<A> extends Fn<Y<A>, Fn<A, A>> { static <A> Y<A> Y() { return f -> f.apply(f); } } static <A> Fn<Fn<Fn<A, A>, Fn<A, A>>, Fn<A, A>> Y() { return g -> Y.<A>Y().apply(f -> g.apply(x -> f.apply(f).apply(x))); } }
J8SK
Написал тут на досуге SK на джаве
теперь думаю что с ним дальше делать? )
вобще планы были более грандиозные но пока вот на этом остановился както
может еще продолжу в том же духе если будет настроение)
Update: вот продолжил :)
import java.util.function.Function; public interface SK { // Kxy = x static <X, Y> Function<Y, X> K(X x) { return y -> x; } static <X, Y> Function<X, Function<Y, X>> K() { return x -> y -> x; } // Sxyz = xz(yz) static <X, Y, Z> Function<Z, X> S( final Function<Z, Function<Y, X>> x, final Function<Z, Y> y) { return z -> x.apply(z).apply(y.apply(z)); } static <X, Y, Z> Function< Function<Z, Function<Y, X>>, Function<Function<Z, Y>, Function<Z, X>> > S() { return x -> y -> z -> x.apply(z).apply(y.apply(z)); } }
теперь думаю что с ним дальше делать? )
вобще планы были более грандиозные но пока вот на этом остановился както
может еще продолжу в том же духе если будет настроение)
Update: вот продолжил :)