Java 8和lambda演算等价

use*_*039 8 java function lambda-calculus java-8

有没有人知道如何在java中编写(无类型)lambda演算的基本表达式?即

  • 身份(λx.x),
  • 自我应用(λx.xx)和
  • 功能应用(λx.λarg.xarg)

Java不是无类型的,所以我想任何解决方案都必须适应类型.但我只发现以下内容,请阅读解决方案:

static<T> Function<T,T> identity() {
    return x->x;
}

static<T> Function<? extends Function<? super Function,T>,T> self() {
    return x->x.apply(x);
}

static <B,C> Function<? extends Function<B,C>, Function<B,C>> apply() {
   return x -> arg -> x.apply(arg);
}
Run Code Online (Sandbox Code Playgroud)

我甚至不确定它们是否正确(!).任何人都可以提出更好的选择吗?


编辑:注意,我试图尽可能少地使用语法糖或现成函数来应用lambda演算的基本概念.例如,我知道有identity(),BiFunction等.我试图实现上面只有基本的lambda结构可用,这意味着基本上只有函数应用程序

Hoo*_*pje 7

您的身份和应用解决方案是正确的.如果不将它们定义为功能然而,我发现x->xFunction::apply的可读性identity()apply(),所以我就干脆直接使用它们.

至于自我应用,好吧,正如你注意Java的类型,并且在类型化的lambda演算中,自我应用是不可能的(至少在我知道的所有类型的lambda演算中).你可以通过使用原始类型(就像你做的那样)生成一些东西,但是你基本上扔掉了类型系统的一部分.

但是,为什么你需要这一切呢?