xacid: (Default)
    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;
            }
        };
    }

Derive4J

Oct. 11th, 2016 12:00 am
xacid: (Default)
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)

J8SKY

Sep. 21st, 2016 01:16 am
xacid: (Default)
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

Sep. 19th, 2016 11:54 pm
xacid: (Default)
Написал тут на досуге SK на джаве

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: вот продолжил :)

Profile

xacid: (Default)
xacid

April 2021

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 26th, 2025 10:12 am
Powered by Dreamwidth Studios