java - Java 的分类终端对象

标签 java functional-programming category-theory

我正在寻找 Java 中分类终端对象的规范表示 (1);只能取一个值的对象。

我知道 Void 可用。但是,这更适合作为初始对象 (0),因为它无法实例化。我知道我可以返回一个 null Void 对象。从这个意义上说,每个 Java 对象都是+1。正是出于这个原因,我想编写 null 免费代码。此外,返回 null 对于我的特定用例来说不是一个可行的解决方案。

最佳答案

让我们至少简单地重申一下定义, 并将接口(interface)与实现分开。一、界面:

import java.util.function.Function;

interface TerminalObj<X> {
  <Y> Function<Y, X> uniqueTerminalMorphism();
}

现在,毫不奇怪,一个带有单个元素作为终端对象的枚举:

import java.util.function.Function;

enum Unit {
  UNIT;

  public static TerminalObj<Unit> terminalObj() {
    return new TerminalObj<Unit>() {
      public <X> Function<X, Unit> uniqueTerminalMorphism() {
        return x -> UNIT;
      }
    };
  }
}

一个非常无聊的演示:

import java.util.function.Function;

class TerminalObjMain {
  public static void main(String[] args) {
    TerminalObj<Unit> universalProperty = Unit.terminalObj();
    Function<String, Unit> boringFunction = universalProperty.<String>uniqueTerminalMorphism();

    System.out.println(boringFunction.apply("Hello, world..."));
    // prints "UNIT", who would have thought that?

  }
}

不要太努力地向任何方向扩展它:Java 甚至没有...

关于java - Java 的分类终端对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753583/

相关文章:

java - svn 导致 eclipse 中的构建错误

design-patterns - Scala 功能设计模式目录

haskell - 为什么 ArrowApply 在证明与 Monads 等价时是唯一的选择?

java - 无法使用 Selenium Java 将按键发送到数字输入字段

java - Java 中的 CpuTime。它与真实的 CPU 周期有何对应?

haskell - 这个函数是否利用了haskell的惰性求值

haskell - 什么是偏序?

haskell - Haskell 中的双分类

java - BigInteger 如何存储

r - 将字符串作为参数名称/值对传递给 R 函数