Java 中的选项 T?可能吗?
OptionT in Java? Is it possible?
我对 ScalaZ 提供的 monad 转换器印象深刻,现在我很感兴趣是否可以在 Java 中实现类似 OptionT
的东西?
在 Scala 中,我们可以使用 TypeClass
es 来简化实现。 Java中有这样的东西吗?
没有。 OptionT
是一个 higher-kinded 类型构造函数,这意味着它需要一个 类型构造函数(而不是类型)作为参数。 Java 不支持更高种类的类型构造函数,在 Java 中,类型构造函数(又名 generic class / interface)只能接受类型作为参数和 return 类型。
类型构造函数与函数非常相似,除了类型级别。函数(在某些数学分支中也称为 值构造函数 )将值作为参数和 returns 值。如果它接受一个函数作为参数 and/or return 一个函数,那么它被称为 高阶 函数。并不是所有的东西都允许高阶函数,例如C 不支持它们。
类似地,类型构造函数将类型作为参数和 returns 类型(它 "constructs types from types",例如 List
类型构造函数将构造类型 "list of integers",当你将它 Int
作为参数传递)。与函数类似,当类型构造函数可以将类型构造函数作为参数或 returns 类型构造函数时,它被称为 higher-kinded,但并非所有地方都支持它们。特别是,Java 不允许它们。
注意:你可以实际上在Java中说出类似Foo<Foo>
的东西,但那是不是 更高类型的构造函数。这里的两个Foo
其实是不同的东西:第一个Foo
是泛型Foo<T>
,第二个 Foo
是 原始类型 Foo
,它是 Java 5.[=19= 中引入泛型的方式的产物]
是的,这是可能的,但有很多技巧:https://github.com/highj/highj/blob/master/src/main/java/org/highj/data/transformer/MaybeT.java
提到的 https://github.com/highj/highj 库使用普通泛型模拟高阶多态性。因此,您必须手动将高阶表示形式的结果转换回它们的 "normal" 形式。
我对 ScalaZ 提供的 monad 转换器印象深刻,现在我很感兴趣是否可以在 Java 中实现类似 OptionT
的东西?
在 Scala 中,我们可以使用 TypeClass
es 来简化实现。 Java中有这样的东西吗?
没有。 OptionT
是一个 higher-kinded 类型构造函数,这意味着它需要一个 类型构造函数(而不是类型)作为参数。 Java 不支持更高种类的类型构造函数,在 Java 中,类型构造函数(又名 generic class / interface)只能接受类型作为参数和 return 类型。
类型构造函数与函数非常相似,除了类型级别。函数(在某些数学分支中也称为 值构造函数 )将值作为参数和 returns 值。如果它接受一个函数作为参数 and/or return 一个函数,那么它被称为 高阶 函数。并不是所有的东西都允许高阶函数,例如C 不支持它们。
类似地,类型构造函数将类型作为参数和 returns 类型(它 "constructs types from types",例如 List
类型构造函数将构造类型 "list of integers",当你将它 Int
作为参数传递)。与函数类似,当类型构造函数可以将类型构造函数作为参数或 returns 类型构造函数时,它被称为 higher-kinded,但并非所有地方都支持它们。特别是,Java 不允许它们。
注意:你可以实际上在Java中说出类似Foo<Foo>
的东西,但那是不是 更高类型的构造函数。这里的两个Foo
其实是不同的东西:第一个Foo
是泛型Foo<T>
,第二个 Foo
是 原始类型 Foo
,它是 Java 5.[=19= 中引入泛型的方式的产物]
是的,这是可能的,但有很多技巧:https://github.com/highj/highj/blob/master/src/main/java/org/highj/data/transformer/MaybeT.java
提到的 https://github.com/highj/highj 库使用普通泛型模拟高阶多态性。因此,您必须手动将高阶表示形式的结果转换回它们的 "normal" 形式。