?

Log in

No account? Create an account

_xacid_

Recent Entries

_xacid_

View

Navigation

August 6th, 2017

Dotty / Scala 3.0 forAll

Share
Поиграл немного с недавней 0.2.0-RC1 dotty и кроме того что там еще всё сыро (это конечно ожидаемо) обнаружил еще один для меня лично достаточно неприятный факт который можно проиллюстрировать вот этой ссылкой

https://github.com/lampepfl/dotty/issues/2500

Проблема заключается в том что несмотря на то что в дотти уже реализованно частичное применение типов и даже на первый взгляд вроде бы нормальные лямбды на уровне типов (в дотти это одно и то же, кстати Одерский на эту тему написал целый пейпер) , практическое применение этой привлекательной и потенциально полезной возможности остается по большей части не ясным по причине все еще отсутствия в дотти нормальных же полиморфных значений с квантификатором forAll, а при попытке какого либо использования частично примененного типа или его лямбды компилятор начинает либо требовать полного применения типа либо просто жалуется что не найден параметр типа. Выше ссылка на предложение таки добавить логичное forAll чтобы это начало нормально работать однако не заметно чтобы это предложение нашло поддержку со стороны Одерского и судя по всему нет уверенности что таки это както решится (хотя конечно хочется в это верить). А жаль :(

С другой стороны конечно я возможно чего нибудь пока не понимаю в этом вопросе :)

August 4th, 2017

Dunning & Kruger

Share


public interface Typed {

    interface Fun<A, B> {
        B $(A a);
    }

    interface Pair<A, B, C> extends Fun<Fun<A, Fun<B, C>>, C> {
        static <A, B, C> Pair<A, B, C> $(final A a, final B b) {
            return p -> p.$(a).$(b);
        }

        static <A, B> A first(final Pair<A, B, A> p) {
            return p.$(a -> b -> a);
        }

        static <A, B> B second(final Pair<A, B, B> p) {
            return p.$(a -> b -> b);
        }
    }

Read more...Collapse )

    Expr<Integer> expr = fun("a", (Expr<Integer> a) ->
            fun("b", (Expr<Integer> b) -> plus(a, b))
                    .$(1)).$(2);

    // (a -> (b -> a + b) 1) 2 = 3

    static void main(final String[] args) {

        System.out.println(showEval(expr)
                .$(s -> e -> s + " = " + e));
    }
}

July 30th, 2017


import java.util.Objects;

public interface Untyped {

    interface Lambda {
        Lambda $(Lambda f);
Read more...Collapse )

    Lambda I = x -> x;
    Lambda K = x -> y -> x;
    Lambda S = x -> y -> z -> x.$(z).$(y.$(z));

    Lambda pair = p -> a -> b -> p.$(a).$(b);
    Lambda first = p -> p.$(a -> b -> a);
    Lambda second = p -> p.$(a -> b -> b);

    static void main(String[] args) {

        print(S.$(K).$(K).$("x").equals(I.$("x")));

        pair.$("x").$("y").$(first).$(print);

        second.$("x").$("y").$(print);

        $("x").$("y").$(first).$(print);

        $("x").$("y").$(K.$(print));
    }
}

Powered by LiveJournal.com