java - 使用 Java 8 的 Monad

标签 java java-8 monads option-type

为了帮助理解 monad 是什么,有人可以提供一个使用 java 的示例吗?他们可能吗?

如果您从此处下载预发布的 lambda 兼容 JDK8,则可以使用 java 进行 Lambda 表达式 http://jdk8.java.net/lambda/

下面显示了一个使用这个 JDK 的 lambda 示例,有人可以提供一个比较简单的 monad 吗?

public interface TransformService {
        int[] transform(List<Integer> inputs);
    }
    public static void main(String ars[]) {
        TransformService transformService = (inputs) -> {
            int[] ints = new int[inputs.size()];
            int i = 0;
            for (Integer element : inputs) {
                ints[i] = element;
            }
            return ints;
        };

        List<Integer> inputs = new ArrayList<Integer>(5) {{
            add(10);
            add(10);
        }};
        int[] results = transformService.transform(inputs);
    }

最佳答案

仅供引用:

建议JDK8 Optional满足三个Monad laws .这是 gist demonstrating那个。

Monad 只需要提供两个符合三个法则的函数。

两个功能:

  1. 将一个值放入一元上下文中

    • Haskell 的 Maybe:return/Just
    • Scala 的选项:Some
    • 函数式 Java 选项:Option.some
    • JDK8 的可选:Optional.of
  2. 在单子(monad)上下文中应用一个函数

    • Haskell 的 Maybe:>>= (又名 bind)
    • Scala 的选项:flatMap
    • 函数式 Java 选项:flatMap
    • JDK8 的可选:flatMap

请参阅 above gist三个定律的java演示。

注意:要理解的关键事项之一是 在单子(monad)上下文中应用的函数的签名:它采用原始值类型,并返回单子(monad)类型。

换句话说,如果您有 Optional<Integer> 的实例,你可以传递给它的函数flatMap方法将具有签名 (Integer) -> Optional<U> , 其中 U是一个值类型,不必是 Integer ,例如 String :

Optional<Integer> maybeInteger = Optional.of(1);

// Function that takes Integer and returns Optional<Integer>
Optional<Integer> maybePlusOne = maybeInteger.flatMap(n -> Optional.of(n + 1));

// Function that takes Integer and returns Optional<String>
Optional<String> maybeString = maybePlusOne.flatMap(n -> Optional.of(n.toString));

您不需要任何类型的 Monad 接口(interface)来以这种方式编码或以这种方式思考。在 Scala 中,您无需对 Monad 接口(interface)进行编码(除非您使用的是 Scalaz 库...)。 JDK8 似乎也将授权 Java 人员使用这种风格的链式单元计算

希望对您有所帮助!

更新:关于此的博客 here .

关于java - 使用 Java 8 的 Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13454347/

相关文章:

scala - 为什么 scala.util.Try 不实现 GenTraversableOnce?

java - 如何使用 spring 注入(inject)或 Autowiring Class 类型?

java - 可完成的 future : Waiting for first one normally return?

java - 如何比较两个 map 并检索两个 map 中出现的值的键?

java - for循环在JAVA中使用lambda表达式

haskell - Monad 理论和 Haskell

java - 浅拷贝 - 新实例或赋值

java - jsp相册可以解析为类型

java - JLabel 未显示在框架中

haskell - 等式推理与喜结连理