我正在研究功能Java,我不明白P1是什么。任何人都可以解释和/或举个例子吗?
(背景:我确实知道什么是currying和closures)
答案 0 :(得分:6)
直接来自Functional Java的Google代码项目:
联合联合类型(元组)是其他类型的产品。提供了产品1-8的产品(fj.P1-fj.P8)。当您想要从函数返回多个值时,或者当您想要在实现只接受一个参数的接口方法时接受多个值时,这些非常有用。它们还可用于获取超过其他数据类型的产品,例如列表(zip函数)。
// Regular Java
public Integer albuquerqueToLA(Map<String, Map<String, Integer>> map) {
Map m = map.get("Albuquerque");
if (m != null)
return m.get("Los Angeles"); // May return null.
}
// Functional Java with product and option types.
public Option<Integer> albuquerqueToLA(TreeMap<P2<String, String>, Integer>() map) {
return m.get(p("Albuquerque", "Los Angeles"));
}
答案 1 :(得分:4)
P1
看起来像1元素,琐碎的product type。在Haskell中,它将写成:
data P1 a = P1 a
(Haskell中的Identity
类型)。
也就是说,它是一个容纳其他类型a
的容器。
此类型还实现了最简单的monad Identity
,它允许将函数不透明地应用于框的内容。
计算上,没有理由使用Identity
monad而不是简单地将函数应用于其参数的简单行为,但是,它在设计monad变换器堆栈时非常有用。
monad实现身份monad是微不足道的,
return a = P1 a
(P1 m) >>= k = k m
如您所见,这只是功能应用。
答案 2 :(得分:4)
啊哈,found this post:
>>> Also, P1 is potentially lazy. We use it for the implementation of >>> Stream, for example.
因此,我没有直接返回类型T,而是可以返回P1<T>
,就像Google Collections Supplier<T>
一样,只有在调用P1._1()
时才计算包含的值。
(嗯,这篇博文Lazy Error Handling in Java也很有趣......)