每个方法仅需要一个参数的链接方法是否等同于curring?


15

我最近一直在研究Ruby,发现自己想知道在纯面向对象的语言(甚至是非纯语言)中,仅采用一个参数然后链接在一起的方法是否等效于在具有功能的语言中使用样式?如果没有,为什么不呢?对于这个问题的详细,甚至严格的答复,我将不胜感激。

Answers:


14

面向对象语言中的方法链接与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

(摘自Daniel Yankowsky的博客

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接口一样

希望对您有所帮助。


+1:我知道,但我想我不可能像您一样清楚地阐明它。
彼得·罗威尔

很好地说明了,这是一个绿色的对勾,表示您的麻烦。
世界工程师

关于StringBuilder的非常好的示例的问题-如果没有toString()调用,我们是否无法有效地复制调用中的计算意图?我只是想让面向对象的概念变得直白。
Sridhar Sarnobat,2015年

1
@ Sridhar-Sarnobat咖喱函数返回另一个带有较少参数的函数。消除的参数在返回的函数中转换为内部常量。某些对象被视为Java 8中的函数,这可能会造成混淆,但是StringBuilder并不是其中之一。嗯,在StringBuilder中,该append(charSeq)函数是该函数的咖喱形式,insert(destOffset, charSeq)其中destOffset始终为StringBuilder的长度。
GlenPeterson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.