【问题标题】:Functional Java bind arity-2 Function (F2) to options函数式 Java 将 arity-2 函数 (F2) 绑定到选项
【发布时间】:2011-08-28 08:52:25
【问题描述】:

我理解 Option with function java as 的基本绑定语法

Option.some(2).bind(new F<Integer,Option<Integer>>(){
    public Option<Integer>f(Integer i){
        return Option.some(i/2);
    }
};

这适用于单输入功能,但我不知道如何使用多个输入功能(如 F2、F3 等)。

即:

new F2<Integer,Integer,Option<Integer>>(){
    public Option<Integer>f(Integer a,Integer b){
        return Option.some(a/b);
    }
} 

我知道我遗漏了一些东西,但文档有点稀疏。 想法?

【问题讨论】:

    标签: java functional-programming functional-java


    【解决方案1】:

    您的解决方案有效,使用元组(单个参数)而不是两个参数并使用它们。 另一种可能更好的方法是(我在这个方法上是第二个 Diego)使用部分函数和 curry。 例如,您可以执行以下操作:

    public final F2<Integer, Integer, Option<Integer>> sumInteger() {
        return new F2<Integer,Integer,Option<Integer>>() {
            @Override
            public Option<Integer> f(Integer a, Integer b) {
                /* you logic here */
            }
        }; 
    }
    
    public final F<Integer, Option<Integer>> partialSumInteger(final F2<Integer, Integer, Option<Integer>> f2, final Integer fixed) {
        return Function.partialApply2(f2.curry(), fixed);
    }
    

    然后将您现在的 1-arity 函数传递给绑定。看看函数式 Java 的类 fj.Function,它包含用于柯里化和部分应用你的 n 元函数的函数。我同意文档不是最好的。

    【讨论】:

      【解决方案2】:

      突破,

      诀窍是您需要取消 arity 函数并将其绑定到您的选项的乘积。

      例如:

      arity-5 实现

      import fj.F;
      import fj.F5;
      import fj.P5;
      
      public abstract class F5Optional<At, Bt, Ct, Dt, Et, Ft> extends F5<At, Bt, Ct, Dt, Et, Ft> {
      
          public final F<P5<At, Bt, Ct, Dt, Et>, Ft> tupleize() {
              return new F<P5<At, Bt, Ct, Dt, Et>, Ft>() {
      
                  @Override
                  public Ft f(final P5<At, Bt, Ct, Dt, Et> p) {
                      return F5Optional.this.f(p._1(), p._2(), p._3(), p._4(), p._5());
                  }
              };
          }
      
      }
      

      用法:

          F5Optional<Integer, Integer, Integer, Integer, Integer, Option<Integer>> f5 = new F5Optional<Integer, Integer, Integer, Integer, Integer, Option<Integer>>() {
      
              @Override
              public Option<Integer> f(Integer a, Integer b, Integer c, Integer d, Integer e) {
                  return Option.some(a + b + c + d + e);
              }
          };
          Option<Integer> test2 = b.bindProduct(Option.some(1), Option.some(1), Option.some(1), Option.some(1)).bind(f5.tupleize());
          Assert.assertTrue(new Integer(8).equals(test2.toNull()));
      
          Option<Integer> nullInteger = Option.none();
          Option<Integer> test3 = b.bindProduct(nullInteger, Option.some(1), Option.some(1), Option.some(1)).bind(f5.tupleize());
          Assert.assertTrue(test3.isNone());
      

      【讨论】:

        【解决方案3】:

        我不确定您要问什么,但如果您尝试将二元函数绑定到 Option,则应在绑定之前部分应用二元函数。因此,这将导致一个具有固定第一个参数的一元函数:

        (new F2<...>{ ... }).f(5)
        

        (将第一个参数绑定到5,返回一个新的一元函数)。

        我已经搜索并没有找到 second 参数的部分应用程序。这很奇怪。

        【讨论】:

        • 在真正的函数式编程语言中,你可以使用flip f b a = f a b 然后flip myfunc b
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 2016-10-01
        • 2015-12-15
        • 2014-06-03
        • 2017-03-11
        相关资源
        最近更新 更多