Answers:
面向对象语言中的方法链接与curring有点不同。根据定义,currying的结果是原始函数的一种更受限制的形式。按照惯例,方法链接的结果是原始(通常是非功能性)对象的修改形式。方法链接可以与同一类上的不相关方法一起使用,而currying涉及返回一个函数,该函数中原始函数的一个或多个参数是固定的(预定的)。
在Java中,方法链接类似于:
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
因此,每个.append()方法调用均返回指向匿名StringBuilder对象的指针。每个.append()之后,此对象都是完整的,并且不是函数。
相比之下,在Scala中,部分应用程序或currying类似于:
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
simpler()
在此示例中是的包装函数simple()
。 simpler()
仍然是一个函数,它需要更多参数才能对其求值,但其自身的限制版本除外。
编辑:一天后阅读这篇文章,我认为“包装功能”是关键。最好使用包装器方法在Java中模拟Currying或部分应用程序。
public interface Simpler {
public int apply(int y, int z);
}
public class Simple {
public int apply(int x, int y, int z) { return x * (y + z); }
public Simpler partiallyApply(final int x) {
final simple = this;
return new Simpler() {
@Override
public int apply(int y, int z) {
// x is the final int parameter to partiallyApply()
simple.apply(x, y, z);
}
}
}
}
:结束编辑
方法链接可以类似于部分应用程序或部分应用程序,但是它只能与返回其他方法(查找Functors)的方法等效,然后需要使用有意义地建模应用程序或部分应用程序的返回类型来设置方法。
方法链接通常用于实现诸如惰性评估之类的东西,就像Java 8中的“ Builder”设计模式和新的Collections Library接口一样。
希望对您有所帮助。
toString()
调用,我们是否无法有效地复制调用中的计算意图?我只是想让面向对象的概念变得直白。
append(charSeq)
函数是该函数的咖喱形式,insert(destOffset, charSeq)
其中destOffset
始终为StringBuilder的长度。