美文网首页程序员Java 杂谈
函数式的序对定义及其Java 实现

函数式的序对定义及其Java 实现

作者: 沪上最强亚巴顿 | 来源:发表于2018-03-31 16:11 被阅读30次

根据Alonzo Church 的lambda 算子的思路, 在Lisp 中序对的构造和选择函数, 可以使用以下的定义:

(Define (cons x y)
        (λ (m) (m x y)))
(Define (car x)
        (x (λ (a d) a)))
(Define (cdr x)
        (x (λ (a d) d)))

这种形式的定义, 仅仅使用了函数定义和函数调用, 而不借助任何的局部变量和赋值语句.

使用最简化的替代模型, 就可以推演出基本的运行步骤.

(car (cons 35 47)) =>
(car ((λ (m) (m 35 47))))
((λ (m) (m 35 47)) (λ (a d) a))
((λ (a d) a) 35 47)
35

那么, 在Java 这种面向对象的语言中, 应该如何仅通过函数来定义此类函数呢?

  public static <T> Function<BiFunction<T, T, T>, T> cons(T x, T y) {
    return m -> m.apply(x, y);
  }

  public static <T> T car(Function<BiFunction<T, T, T>, T> cons) {
    return cons.apply((a, b) -> a);
  }

  public static <T> T cdr(Function<BiFunction<T, T, T>, T> cons) {
    return cons.apply((a, b) -> b);
  }

对应的测试代码如下:

  @Test
  public void test_should_cons_car_cdr() {
    Function<BiFunction<Integer, Integer, Integer>, Integer> cons = cons(1, 2);

    Assert.assertThat(car(cons), is(1));
    Assert.assertThat(cdr(cons), is(2));
  }

以以上的代码为例, 可以对比Lisp 和Java 中函数式的写法.

  • 函数定义

    Lisp: (λ (m) (m x y))
    Java: m -> m.apply(x, y);
    
  • 函数应用(实参为函数)

    Lisp: (x (λ (a d) a))
    Java: cons.apply((a, b) -> a)
    

相关文章

  • 函数式的序对定义及其Java 实现

    根据Alonzo Church 的lambda 算子的思路, 在Lisp 中序对的构造和选择函数, 可以使用以下的...

  • Java lambda表达式

    1. Java函数式接口 Java实现函数式编程的方式是函数式接口(functional interface),函...

  • 用Java DIY 函数式方法—— flatmap

    本文是 用Java DIY 函数式方法—— map 续篇, 解决如何使用java实现函数式方法-flatmap。 ...

  • JAVA8函数式接口学习

    JAVA8函数式接口 函数式接口是java8的一种新特性,函数式接口定义了且只定义了一个抽象方法!该接口非常有用,...

  • 12.函数式接口

    主要内容 自定义函数式接口 函数式编程 常用函数式接口 第一章 函数式接口 1.1 概念 函数式接口在Java中是...

  • 02 Java-Lambda-Java 8 自带的函数接口

    Java 8 自带的函数接口 我们使用lambda在处理自己定义的业务时,需要自定义函数式接口,其实java8已经...

  • Java中的回调函数为什么只能访问final变量?

    经常写JS的话对函数式编程应该不陌生,JS是天然支持函数式的,而在Java中,需要用一个接口来实现伪函数编程,类似...

  • 42 函数式接口

    函数式接口在Java中是有且只有一个抽象方法的接口,java中就是使用Lambda接口作为函数式接口 定义接口格式...

  • 使用 Matplotlib 绘图

    使用 Matplotlib 绘图 绘制多项式函数 绘制多项式函数及其导函数 分别绘制多项式函数及其导数 K 线图 ...

  • Java 函数式编程

    从历史上看,用 Java 进行函数式编程并不容易,甚至一些函数式编程在 Java 中是不可能实现的。在 Java...

网友评论

    本文标题:函数式的序对定义及其Java 实现

    本文链接:https://www.haomeiwen.com/subject/pyogcftx.html