Java 8 lambda和alpha等价

时间:2017-06-28 12:42:46

标签: java lambda java-8 lambda-calculus

我想知道,在Java-8中实现alpha-equivalence比较有什么好方法(如果可能的话)?

显然这两个lambda-s是alpha等价的。让我们假设在某些情况下我们想要发现这个事实。如何实现?

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

1 个答案:

答案 0 :(得分:11)

我带着这个答案出去了,但可能值得一提:

没有办法做到这一点。正如Brian Goetz在answer to a related question中指出的那样,没有明确,可靠的方法来获取&#34;内容&#34;在这个意义上,一个lambda。

但是(现在是模糊的,手工操作的部分):

无法做到这一点尚未

将来可能会这样做。也许不是Java 9,但后来。 Project Panama具有两个目标,其中包括让开发人员更深入地访问lambdas,帮助进一步(运行时)优化,翻译和处理。

最近,Radosław Smogura posted in the mailing list

  

我尝试捕获lambda表达式,以便在运行时将它们作为表达式树。我能够为像(o) - &gt;这样简单的lambdas做这件事。 (var == var)&amp;&amp; ((varX == varX)&amp;&amp;(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视为&#34;等于&#34;,而不管实际变量 name

邮件列表消息指向存储库:

  

(免责声明:我没有对此进行测试,也不知道如何运行(或者是否可以运行) - 但根据我的理解,它至少非常接近问题实际上是什么)。