功能性java:这个P1的东西是什么?

时间:2011-04-24 19:16:30

标签: java types functional-programming monads

我正在研究功能Java,我不明白P1是什么。任何人都可以解释和/或举个例子吗?

(背景:我确实知道什么是currying和closures)

3 个答案:

答案 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也很有趣......)