El encadenamiento de métodos en lenguajes orientados a objetos es un poco diferente al curry. Por definición , el resultado del currículum es una forma más restringida de la función original . Por convención , el resultado de encadenamiento método es una forma modificada del original (normalmente de no funcionamiento) objeto . El encadenamiento de métodos se puede usar con métodos no relacionados en la misma clase, mientras que el currículum 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 anónimo StringBuilder. 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 es como:
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
(Muestra tomada del blog de Daniel Yankowsky )
simpler()
en este ejemplo es una función de envoltura para simple()
. simpler()
sigue siendo una función que toma más parámetros antes de poder evaluar cualquier cosa que no sea una versión más limitada de sí misma.
EDITAR: Leyendo esto un día después, creo que la "función de envoltura" es la clave. El currículum o la aplicación parcial pueden 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);
}
}
}
}
: EDICIÓN FINAL
El encadenamiento de métodos puede ser similar a la aplicación parcial o al currículum, pero solo puede ser equivalente a los métodos que devuelven otros métodos (buscar Functores), y luego los métodos deben configurarse con tipos de retorno que modelen significativamente el currículum o la aplicación parcial.
El encadenamiento de métodos se usa con mayor frecuencia para implementar algo como la evaluación diferida, como se hace con el patrón de diseño "Generador" y las nuevas interfaces de la Biblioteca de colecciones en Java 8 .
Espero que eso ayude.
toString()
llamada, ¿no estamos replicando efectivamente la intención de curry en nuestra llamada? Solo estoy tratando de entender el concepto de curry en OO.append(charSeq)
función es una forma curricular de lainsert(destOffset, charSeq)
función dondedestOffset
siempre es la longitud de StringBuilder.