【发布时间】:2017-09-06 13:03:18
【问题描述】:
ScalaZ 提供的 monad 转换器给我留下了深刻的印象,现在对是否可以在 Java 中实现类似 OptionT 的东西感兴趣?
在 Scala 中,我们可以使用 TypeClasses 来简化实现。 Java中有这样的东西吗?
【问题讨论】:
-
您可能对独眼巨人感兴趣:medium.com/@johnmcclean/…
ScalaZ 提供的 monad 转换器给我留下了深刻的印象,现在对是否可以在 Java 中实现类似 OptionT 的东西感兴趣?
在 Scala 中,我们可以使用 TypeClasses 来简化实现。 Java中有这样的东西吗?
【问题讨论】:
没有。 OptionT 是一个更高种类的类型构造函数,这意味着它需要一个类型构造函数(而不是类型)作为参数。 Java 不支持更高种类的类型构造函数,在 Java 中,类型构造函数(又名 generic class/interface)只能将类型作为参数和返回类型。
类型构造函数与函数非常相似,除了类型级别。函数(在某些数学分支中也称为值构造函数)将值作为参数并返回值。如果它接受一个函数作为参数和/或返回一个函数,那么它被称为 higher-order 函数。并非所有东西都允许高阶函数,例如C 不支持它们。
同样,类型构造函数将类型作为参数并返回类型(它“从类型构造类型”,例如,List 类型构造函数将构造一个类型“整数列表”,当您将 Int 作为争论)。与函数类似,当类型构造函数可以接受类型构造函数作为参数或返回类型构造函数时,则称为higher-kinded,并非所有地方都支持。特别是,Java 不允许它们。
注意:您可以在Java中实际上说类似Foo<Foo>的东西,但这不是更高种类的构造函数。这里的两个Foo实际上是不同的东西:第一个Foo是通用类型Foo<T>,第二个Foo是raw type Foo,这是 Java 5 中引入泛型方式的产物。
【讨论】:
是的,这是可能的,但有很多诡计:https://github.com/highj/highj/blob/master/src/main/java/org/highj/data/transformer/MaybeT.java
提到的https://github.com/highj/highj 库使用普通泛型模拟高阶多态性。因此,您必须手动将高阶表示的结果转换回它们的“正常”形式。
【讨论】: