为了帮助理解 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 只需要提供两个符合三个法则的函数。
两个功能:
将一个值放入一元上下文中
- Haskell 的 Maybe:
return
/Just
- Scala 的选项:
Some
- 函数式 Java 选项:
Option.some
- JDK8 的可选:
Optional.of
- Haskell 的 Maybe:
在单子(monad)上下文中应用一个函数
- Haskell 的 Maybe:
>>=
(又名bind
) - Scala 的选项:
flatMap
- 函数式 Java 选项:
flatMap
- JDK8 的可选:
flatMap
- Haskell 的 Maybe:
请参阅 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/