Подтвердить что ты не робот

Java 8 лямбда и альфа-эквивалентность

Мне интересно, любой хороший способ (если вообще возможно) реализовать альфа-эквивалентность в Java-8

Очевидно, что эти два лямбда-альфа-эквивалента. Предположим, что в некоторых случаях мы хотим обнаружить этот факт. Как это можно достичь?

Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 1;
4b9b3361

Ответ 1

Я выхожу на конечность с этим ответом, но, возможно, стоит упомянуть об этом:

Нет никакого способа сделать это. Как указал Брайан Гетц в ответе на соответствующий вопрос, в этом смысле нет конкретных надежных способов получения "содержимого" лямбда.

Но (и теперь идет расплывчатая, ручная часть):

Нет способа сделать это еще.

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

И недавно Radosław Smogura опубликован в списке рассылки:

Я пытаюсь захватить лямбда-выражение, чтобы получить их как дерево выражений во время выполнения. Im способен сделать это для простых lambdas like (o) → (var == var) && & & ((varX == varX) && (someField + 1 == 1)), поэтому позже пользователь может использовать (отсутствует) API для изучения дерева.

Прямо сейчас к дереву можно получить доступ с таким кодом:

Method m = BasicMatadataTest.class.getDeclaredMethod("lambda$meta0");
Expression e = (Expression) m.invoke(null);
BinaryExpression top = (BinaryExpression) e;
BinaryExpression vars = (BinaryExpression) top.getLefthandExpression(); // represents (var == var)
(VariableExpression) vars.getLefthandExpression() // represents first var, and it’s reference equal to vars.getRighthandExpression() as it’s same variable 

...

Ключевым моментом здесь может быть комментарий:

представляет первый var, а его ссылочный - vars.getRighthandExpression() как его же переменную

(e.b.m)

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

Сообщение списка рассылки указывает на репозитории:

(Отказ от ответственности: я не тестировал это и не знаю, как это сделать (или это вообще работает), но, на мой взгляд, это, по крайней мере, очень близко к тому, что было на самом деле),