¿Los métodos encadenados que requieren solo un parámetro por método son equivalentes a los de curry?

15

Últimamente he estado jugando con Ruby y me he preguntado si en lenguajes orientados a objetos puros (e incluso en aquellos que no lo son), hacer métodos que tomen solo un parámetro y luego se encadenen es equivalente a curry en lenguajes ¿Con un estilo funcional? ¿Si no, porque no? Apreciaría una respuesta detallada, incluso rigurosa, sobre el tema.

    
pregunta World Engineer 03.02.2013 - 04:20
fuente

1 respuesta

14

El encadenamiento de métodos en lenguajes orientados a objetos es un poco diferente del curry. Por definición , el resultado del curry es una forma más restringida de la función original. Por convención , el resultado del encadenamiento de métodos es una forma modificada del objeto original (generalmente sin función). El encadenamiento de métodos se puede usar con métodos no relacionados en la misma clase, mientras que el curry implica devolver una función donde uno o más parámetros de la función original son fijos (predeterminados).

En Java, el encadenamiento de métodos es como:

String myString = new StringBuilder("Hi ").append(firstName)
                                          .append(" ")
                                          .append(lastName)
                                          .append("!")
                                          .toString();

Entonces, cada una de esas llamadas al método .append () devuelve un puntero al objeto StringBuilder anónimo. Este objeto se completa después de cada .append (), y no es una función.

Por el contrario, en Scala, la aplicación parcial o el curry son como:

def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14

(Ejemplo tomado de blog de Daniel Yankowsky )

simpler() en este ejemplo es una función de envoltorio para simple() . simpler() sigue siendo una función que toma más parámetros antes de poder evaluar nada más que una versión más limitada de sí misma.

EDITAR: Al leer esto un día después, creo que la "función de envoltura" es la clave. La aplicación parcial o en curso podría simularse mejor en Java con métodos de envoltura.

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

:END-EDIT

El encadenamiento de métodos puede ser similar a la aplicación parcial o al curry, pero solo puede ser equivalente con los métodos que devuelven otros métodos (buscar Functors), y luego los métodos deben configurarse con tipos de retorno que modelan de manera significativa el curry o parcial. aplicación.

El encadenamiento de métodos se usa más a menudo para implementar algo como una evaluación perezosa, como se hace con el patrón de diseño "Generador" y el nuevo Interfaces de la biblioteca de colecciones en Java 8 .

Espero que eso ayude.

    
respondido por el GlenPeterson 03.02.2013 - 06:31
fuente

Lea otras preguntas en las etiquetas