我想知道,在Java-8中实现alpha-equivalence比较有什么好方法(如果可能的话)?
显然这两个lambda-s是alpha等价的。让我们假设在某些情况下我们想要发现这个事实。如何实现?
Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 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 。
邮件列表消息指向存储库:
(免责声明:我没有对此进行测试,也不知道如何运行(或者是否可以运行) - 但根据我的理解,它至少非常接近问题实际上是什么)。