为了帮助理解什么是 monad,有人可以提供一个使用 java 的例子吗?他们可能吗?
如果您从此处 http://jdk8.java.net/lambda/ 下载预发布的 lambda 兼容 JDK8,则可以使用 java 来使用 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);
}
原文由 NimChimpsky 发布,翻译遵循 CC BY-SA 4.0 许可协议
仅供参考:
提议的 JDK8 Optional 类 确实满足 三个 Monad 定律。这是 证明这一点的要点。
Monad 所需要的只是提供符合 三个 定律的 两个 函数。
两个函数:
将 值放入 monadic 上下文中
return
/Just
Some
Option.some
Optional.of
在 monadic 上下文中应用函数
>>=
(又名bind
)flatMap
flatMap
flatMap
请参阅 上面的要点 以获得三个定律的 java 演示。
注意:要理解的关键事情之一是 在 monadic 上下文中应用的函数 的签名:它采用原始值类型,并返回 monadic 类型。
In other words, if you have an instance of
Optional<Integer>
, the functions you can pass to itsflatMap
method will have the signature(Integer) -> Optional<U>
, whereU
是一个值类型,它不一定是Integer
,例如String
:您不需要任何类型的 Monad 接口来以这种方式编码或以这种方式思考。在 Scala 中,您无需为 Monad 接口编写代码(除非您使用的是 Scalaz 库…)。 JDK8 似乎也将授权 Java 人员使用这种 _链式单子计算_。
希望这会有所帮助!
更新: 在这里 写博客。