【发布时间】:2011-08-11 23:21:53
【问题描述】:
我正在研究函数式 Java,但我不明白 P1 是什么。谁能解释和/或举个例子?
(背景:我确实知道什么是柯里化和闭包)
【问题讨论】:
标签: java types functional-programming monads
我正在研究函数式 Java,但我不明白 P1 是什么。谁能解释和/或举个例子?
(背景:我确实知道什么是柯里化和闭包)
【问题讨论】:
标签: java types functional-programming monads
啊哈,found this post:
>>> Also, P1 is potentially lazy. We use it for the implementation of >>> Stream, for example.
因此,我可以有一些返回 P1<T> 的东西,而不是直接返回类型 T,就像 Google Collections Supplier<T> 一样,并让它仅在调用 P1._1() 时计算包含的值。
(呵呵,这篇博文Lazy Error Handling in Java也很有趣.....)
【讨论】:
P1 看起来像 1 元素,微不足道的 product type。在 Haskell 中,它会写成:
data P1 a = P1 a
(Haskell 中的 Identity 类型)。
也就是说,它是一个包含其他类型a的容器。
此类型还实现了最简单的 monad,Identity,它允许将函数不透明地应用于框的内容。
在计算上,没有理由使用 Identity monad 来代替简单得多的行为,即简单地将函数应用于参数,但是,它在设计 monad 转换器堆栈时很有用。
identity monad 的 monad 实现很简单,
return a = P1 a
(P1 m) >>= k = k m
如您所见,这只是函数应用程序。
【讨论】:
这直接取自 Functional Java 的 Google 代码项目:
联合联合类型(元组)是其他类型的产品。提供了arities 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"));
}
【讨论】:
p 方法内置于 P 类中。如果您查看文档,他们重载了 p 方法以接受 1-8 个参数并返回相应的产品类型。他们可能使用import static fj.P 来避免使用fj.P.p(...)。