And*_*niy 12 java lambda lambda-calculus java-8
我想知道,在Java-8中实现alpha等价比较是否有任何好的方法(如果可能的话)?
显然,这两个lambda-s是α等价的.让我们假设在某些情况下我们想要发现这个事实.如何实现?
Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 1;
Run Code Online (Sandbox Code Playgroud)
Mar*_*o13 11
这个答案让我走出困境,但值得一提的是:
没有办法做到这一点.正如Brian Goetz在回答相关问题时指出的那样,在这个意义上,没有明确,可靠的方法来获得lambda的"内容".
但是(现在是模糊的,手工操作的部分):
有没有办法做到这一点还没有.
将来有可能这样做.也许不是Java 9,但后来.该项目巴拿马有ambituous的目标,其中,给予开发者lambda表达式更深的访问,进一步(运行时)优化,翻译和处理帮助.
我尝试捕获lambda表达式,以便在运行时将它们作为表达式树.我能够为简单的lambda做这样的事情,如(o) - >(var == var)&&((varX == varX)&&(someField + 1 == 1)),以便以后用户可以使用(缺少)API检查树.
现在可以使用以下代码访问树:
Run Code Online (Sandbox Code Playgroud)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(),因为它是相同的变量
(EBM)
因此,如果我理解你的问题和这个邮件列表正确发布,那么就有可能确定这些表达式之间的等价性:比较树结构将是相当微不足道的(给定上面概述的功能).然后VariableExpression,无论实际的变量名称如何,它都可以归结为将两个视为"相等" .
邮件列表消息指向存储库:
(免责声明:我没有对此进行过测试,也不知道如何运行(或者是否可以运行) - 但根据我的理解,它至少非常接近问题的实际内容.
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |