Java 8 и эквивалент лямбда-исчисления - PullRequest
0 голосов
/ 12 декабря 2018

Кто-нибудь имеет представление о том, как написать основные выражения (нетипизированного) лямбда-исчисления в Java?т. е.

  • идентификатор (λx.x),
  • самостоятельное применение (λx.xx) и
  • применение функции (λx.λarg.x arg)

Java не является нетипизированной, поэтому я думаю, что любое решение должно будет соответствовать типам.Но я нашел только следующие, громоздкие для чтения решения:

static<T> Function<T,T> identity() {
    return x->x;
}

static<T> Function<? extends Function<? super Function,T>,T> self() {
    return x->x.apply(x);
}

static <B,C> Function<? extends Function<B,C>, Function<B,C>> apply() {
   return x -> arg -> x.apply(arg);
}

, и я даже не уверен, что они верны (!).Кто-нибудь может предложить лучшую альтернативу?


Редактировать: Обратите внимание, что я пытаюсь применить основные понятия лямбда-исчисления с как можно меньшим количеством синтаксического сахара или готовых функций.Например, я знаю, что есть identity (), BiFunction и т. Д. Я пытаюсь реализовать вышеизложенное, используя только базовые лямбда-конструкции, а это означает, что в основном используется только приложение функции

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Ваши решения для идентификации и применения верны.Однако, если бы не определить их как функции, я нахожу x->x и Function::apply такими же читаемыми, как identity() и apply(), поэтому я бы просто использовал их напрямую.

Что касается самостоятельного применения,хорошо, как вы заметили, Java является типизированным, а также в типизированном лямбда-исчислении самоприменение невозможно (по крайней мере, во всех типизированных лямбда-исчислениях, которые я знаю).Вы можете создать что-то, используя необработанные типы (как вы это сделали), но затем вы по существу отбрасываете часть системы типов.

Но зачем тебе все это?

0 голосов
/ 12 декабря 2018

Я не очень много использую Java, но недавно он включил лямбда-выражения.Основной способ реализации - это иметь функциональный интерфейс (интерфейс, имеющий только один метод).

Тогда лямбда будет типом этого интерфейса.

    interface Apply
    {
          String ApplyArg(int x);
    }

    public static void main(String args[])
    {
       Apply isEven = (n) -> (n%2) == 0;
       //output true
       System.out.println(isEven.ApplyArg(4));
    }

Вы можете использовать интерфейс универсального типа, чтобы сделать его более универсальным.

Если вы хотите отправить лямбдув качестве аргументов (то есть функций более высокого порядка), то ваш интерфейсный метод примет другой интерфейс.

...