我对ScalaZ提供的monad变换器印象深刻,现在有兴趣在Java中实现像OptionT
这样的东西吗?
在Scala中,我们可以使用TypeClass
es来简化实现。 Java中有这样的东西吗?
答案 0 :(得分:5)
没有。 OptionT
是更高级的类型构造函数,这意味着它需要类型构造函数(而不是类型)作为参数。 Java不支持更高级的类型构造函数,在Java中,类型构造函数(又名泛型类/接口)只能将类型作为参数并返回类型。
类型构造函数与函数非常相似,但类型级别除外。函数(在某些数学分支中也称为值构造函数)将值作为参数并返回值。如果它将函数作为参数和/或返回函数,则它被称为高阶函数。并非一切都允许更高阶的功能,例如C不支持他们。
类似地,类型构造函数将类型作为参数并返回类型(它“从类型构造类型”,例如List
类型构造函数将在传递它时构造类型“整数列表”{{1作为一个参数)。与函数类似,当类型构造函数可以将类型构造函数作为参数或返回类型构造函数时,它将被称为 higher-kinded ,并且它们在任何地方都不受支持。特别是,Java不允许它们。
注意:您可以在Java中实际说出类似Int
的内容,但不是更高级的类型构造函数。这里的两个Foo<Foo>
实际上是不同的东西:第一个Foo
是泛型类型 Foo
,第二个 {{1是原始类型 Foo<T>
,它是Java 5中引入泛型的方式的工件。
答案 1 :(得分:3)
是的,这是可能的,但有很多诡计:https://github.com/highj/highj/blob/master/src/main/java/org/highj/data/transformer/MaybeT.java
提到的https://github.com/highj/highj库模拟了具有普通泛型的高阶多态性。因此,您必须手动将高阶表示中的结果转换回其“正常”形式。