1

関数型Javaを使用したOptionの基本的なバインド構文を次のように理解しています

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);
    }
} 

私は何かが足りないことを知っていますが、ドキュメントは少しまばらです。アイデア?

4

3 に答える 3

0

何を求めているのかわかりませんが、2アリティ関数をにバインドしようとしている場合は、バインドするOption前に2アリティ関数を部分的に適用する必要があります。したがって、これは、最初のパラメーターが固定された単項関数になります。

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

(最初のパラメーターをにバインドし5、新しい単項関数を返します)。

2番目のパラメーターの部分的なアプリケーターを検索しましたが見つかりませんでした。これは変です。

于 2011-05-18T20:38:40.193 に答える
0

画期的な、

秘訣は、アリティ関数をアンカリーして、オプションの製品にバインドする必要があることです。

したがって、例では:

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

ソリューションは、2つのパラメーターの代わりにタプル(単一のパラメーター)を使用して機能し、それらを操作します。別の、おそらくより良いアプローチは、部分関数とカレーを扱うことです(私はこれについて2番目のディエゴです)。たとえば、次のようなことができます。

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アリティ関数を渡してバインドします。関数型Javaのクラスを見てくださいfj.Function。これには、n-arity関数をカリー化して部分的に適用するための関数が含まれています。ドキュメントが最善ではないことに同意します。

于 2013-10-27T19:36:12.287 に答える