【问题标题】:functional java: what's this P1 thing?功能性java:这是什么P1的东西?
【发布时间】:2011-08-11 23:21:53
【问题描述】:

我正在研究函数式 Java,但我不明白 P1 是什么。谁能解释和/或举个例子?

(背景:我确实知道什么是柯里化和闭包)

【问题讨论】:

    标签: java types functional-programming monads


    【解决方案1】:

    啊哈,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也很有趣.....)

    【讨论】:

      【解决方案2】:

      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
      

      如您所见,这只是函数应用程序。

      【讨论】:

      • 这有点帮助,但我根本不懂 Haskell(或单子,就此而言)。
      • 您可能想阅读有关函数式编程的教程,以真正理解它。在 Java 环境中,特别难以看到发生了什么。
      • 我想 -- 但是有没有基于 Java 的?我的大脑已经很充实了,+ 我宁愿不学习 Haskell 只是为了学习一些使用 Java 的新范例。
      【解决方案3】:

      这直接取自 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"));
      }
      

      【讨论】:

      • ,他们是TUPLES!我很困惑,P1 javadoc 列出了一个抽象方法,它把我弄糊涂了。
      • 等等:你为什么要费心使用 P1?我明白你为什么要使用 P2、P3 等。
      • @Jason S:p 方法内置于 P 类中。如果您查看文档,他们重载了 p 方法以接受 1-8 个参数并返回相应的产品类型。他们可能使用import static fj.P 来避免使用fj.P.p(...)
      猜你喜欢
      • 1970-01-01
      • 2013-08-12
      • 2021-06-04
      • 2011-04-27
      • 2015-06-12
      • 1970-01-01
      • 2019-11-24
      • 2017-04-04
      • 2012-10-24
      相关资源
      最近更新 更多