Java 8 Generic 的 Generic for Monad Transformer

标签 java generics functional-programming java-8 monad-transformers

我正在使用“完全懒惰”并且我渴望 Either<String,Option<A>>在我正在编写的程序中。这是将 Monad Transformer 用于 Option 的好地方(类似于 Scalaz 7 中存在的令人敬畏的转换器)。我似乎无法在 Java 8 中正确使用泛型。下面的代码是我希望它看起来像的样子(一开始)。关于如何让它工作/编译的任何建议都将是惊人的!!!请帮我让这个 Monad Transformer 存在于我的 Java 8 代码中。

import com.googlecode.totallylazy.Monad;
import com.googlecode.totallylazy.Option;
import com.googlecode.totallylazy.functions.Function1;
import static com.google.common.base.Preconditions.checkNotNull;

public class OptionT<M extends Monad,A> {
   final M<Option<A>> run;

   public OptionT(final M<Option<A>> run){
       this.run = checkNotNull(run);
   }

   public <B> OptionT<M,B> map(Function1<A,B> f){
       return new OptionT<M,B>(run.map(o-> o.map(f)));
   }
}

编辑:我遇到以下编译器故障:

OptionT.java:15: error: unexpected type
    final M<A> run;
          ^
  required: class
  found:    type parameter M
  where M is a type-variable:
    M extends Monad<Option<?>> declared in class OptionT
OptionT.java:17: error: unexpected type
    public OptionT(final M<A> run){
                         ^
  required: class
  found:    type parameter M
  where M is a type-variable:
    M extends Monad<Option<?>> declared in class OptionT

最佳答案

您可以使用 cyclops-monad-api 来做到这一点,有介绍blog post that you might find helpful here .我是图书馆和博客文章的作者。

我已经在下面发布了您的示例的有效实现(对于 JDK 8 可选)-

public class OptionT<A> {
   @Getter
   final AnyM<Optional<A>> run;

   public OptionT(final AnyM<Optional<A>> run){
       this.run = run;
   }

   public <B> OptionT<B> map(Function<A,B> f){
       return new OptionT<B>(run.map(o-> o.map(f)));
   }


}

@Test
public void test() {
    OptionT<Integer> optionT = new OptionT<>(AnyM.ofMonad(Stream.of(Optional.of(10))));
    System.out.println(optionT.map(num->"hello world"+num).getRun().asSequence().firstValue());
}

打印出来

Optional[hello world10]

AnyM 包装任何 Monad 类型。 Java 不支持 Higher-Kinded-Types,所以你不能把泛型放在泛型上。然而,您可以将 monad 类型包装在一个通用 API 后面,这就是 AnyM 所做的。

如果有人感兴趣,cyclops-monad-api 现在的范围越来越大了 Monad Transformers ,受到这个问题的启发 - 感谢 OP!

关于Java 8 Generic 的 Generic for Monad Transformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32061516/

相关文章:

java - 为什么我的 JavaScript 中没有显示 servlet 响应

java - 如何将 SWT 移植到新平台?

java - 如何在 IDE 之外启动 JavaFX 11 应用程序?

java - 具有相同基类的泛型

c# - 是否可以在匿名类型的属性上实现 setter

Haskell 高阶函数

functional-programming - 在过滤掉 Rust 中的 None 元素后,是否有可能以某种方式将 Vec<Option<Value>> 转换为 Vec<Value> ?

java - 为什么我的@FunctionalInterface 使用两种方法没有编译错误?

java - 我已经在模拟器中编译了 Android 应用程序,现在该怎么办?

Java 泛型接口(interface)返回泛型