Java monad (almost)
Oct. 11th, 2016 02:26 am
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;
}
};
}
https://github.com/derive4j/derive4j
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, morphisms, (near future: optics and typeclasses)
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, morphisms, (near future: optics and typeclasses)
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)));
}
}
Написал тут на досуге 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: вот продолжил :)