【问题标题】:Java 8 lambda and alpha equivalenceJava 8 lambda 和 alpha 等价
【发布时间】:2017-12-01 20:04:48
【问题描述】:

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

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

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

【问题讨论】:

  • @holi-java 这不是 OP 想要的......
  • 如果情况像给定的例子一样简单,比较JVM指令就可以解决问题,因为你可以忽略变量名甚至泛型类型,只比较指令列表.像ASM 这样的框架可以帮助解释和比较字节码指令,但这可能需要做很多工作。
  • @Andremoniy serializeable 可能是一个选项,但我在考虑更大的 lambda 表达式中的顺序或指令,它们可能是等价的,但在 不同 顺序...生病必须尝试一下
  • 您可以使用检测来读取 lambda 类,然后使用 asm 库之类的东西来确定它们是否等效,这对于您提供的简单示例来说可能就足够了,但它不会工作对于更复杂的情况。
  • @Marco13 也许:) 一旦有人提供这样的答案,我会考虑改变我的决定。

标签: java lambda java-8 lambda-calculus


【解决方案1】:

我对这个答案有点犹豫,但可能值得一提:

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

但是(现在是模糊的挥手部分):

目前还没有

将来可能会这样做。也许不是 Java 9,而是更高版本。 Project Panama 有一个宏大的目标,其中包括让开发人员更深入地访问 lambda,帮助进一步(运行时)优化、翻译和处理。

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

我尝试捕获 lambda 表达式以在运行时将它们作为表达式树。我可以为 (o) -> (var == var) && ((varX == varX) && (someField + 1 == 1)) 之类的简单 lambdas 做到这一点,因此以后的用户可以使用(缺少)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 

...

这里的重点可能是评论:

代表第一个变量,它与vars.getRighthandExpression()的引用相等,因为它是同一个变量

(e.b.m)

因此,如果我正确理解了您的问题并且此邮件列表发布正确,则可以确定这些表达式之间的等价性:比较树结构将是相当微不足道的(鉴于上面概述的功能)。然后它可能归结为将两个VariableExpression 视为“相等”,而不管实际变量name

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

(免责声明:我没有测试过这个,也不知道如何让它运行(或者它是否有效) - 但据我了解,它至少 非常 接近这个问题实际上是关于什么的)。

【讨论】:

  • 基本上简短的版本是 - 没办法; 可能会发生,但不会早于 jdk-10。 可能是关键字。
  • 这很有趣,谢谢! +1 但是如果有人通过序列化找到任何结果,仍然会等待一段时间
  • @Andremoniy 当然,这个答案不够深刻,无法接受。可能有序列化或 ASM 或其他字节码魔法的选项,我也很想看到它们(即使 - 这很可能 - 它们会以某种方式依赖于实现或依赖于其他未指定的细节)。但我认为,最终,邮件列表 (@Eugene ;-)) 中勾勒的路径可能通向一个真正的、适当的 API 以实现目标。
  • 我终于明白OP想要做什么了。加一。他想比较一下 lambda body 的逻辑是不是等价的。我说的对吗,先生?但同样的逻辑有很多组合。
  • @holi-java 是的。 Wikipedia: Lambda Calculus Alpha Equivalence 解释了等价的正式定义。据我了解,这个问题的一个核心方面是是否有一种方法可以以编程方式获取 lambda 的“内容”(以便可以实现维基百科网站上描述的逻辑)。 (我认为序列化方法仅适用于非常有限的情况,如果有的话,但这是另一个问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2018-01-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多