1

我将 Option 的基本绑定语法与功能性 java 理解为

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

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

IE:

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

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

4

3 回答 3

0

突破,

诀窍是您需要取消 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());
于 2011-05-18T21:05:03.023 回答
0

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

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

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

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

于 2011-05-18T20:38:40.193 回答
0

您的解决方案有效,使用元组(单个参数)而不是两个参数并使用它们。另一种可能更好的方法是(我在这个方法上是第二个 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 函数传递给绑定。查看 Functional Java 的类fj.Function,它包含用于柯里化和部分应用您的 n-arity 函数的函数。我同意文档不是最好的。

于 2013-10-27T19:36:12.287 回答