我理解Option的基本绑定语法,函数java为
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);
}
}
我知道我错过了什么,但文档有点稀疏。 想法?
答案 0 :(得分:0)
我不确定你在问什么,但如果你试图将双精度函数绑定到Option
,你应该在绑定之前部分应用双精度函数。因此,这将导致具有固定第一参数的一元函数:
(new F2<...>{ ... }).f(5)
(将第一个参数绑定到5
,返回一个新的一元函数。)
我已经搜索过,并且没有找到 second 参数的部分应用程序。这很奇怪。
答案 1 :(得分: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());
答案 2 :(得分:0)
您的解决方案可以使用元组(单个参数)而不是两个参数并使用它们。 另一种可能更好的方法是(我的第二个迭戈就此而言)使用部分功能和咖喱。 例如,您可以执行以下操作:
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函数传递给bind。查看Functional Java的类fj.Function
,它包含用于currying和部分应用n-arity函数的函数。我同意文件不是最好的。