Метод ланцюжка в об'єктно-орієнтованих мовах мало чим відрізняється від карі. За визначенням , результат currying є більш обмеженою формою вихідної функції . За умовою , результат ланцюга методів - це змінена форма вихідного (як правило, нефункціонального) об'єкта . Ланцюжок методів може використовуватися з неспорідненими методами одного класу, тоді як currying включає повернення функції, де один або більше параметрів вихідної функції закріплені (заздалегідь визначені).
У Java ланцюжок методів такий:
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
Отже, кожен із цих методів .append () повертає покажчик на анонімний об'єкт StringBuilder. Цей об'єкт є завершеним після кожного .append (), і це не функція.
Навпаки, у Scala часткове нанесення або висипання виглядає так:
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
(Зразок взято з блогу Даніеля Янковського )
simpler()
у цьому прикладі є функція обгортки для simple()
. simpler()
все ще функція, яка приймає більше параметрів, перш ніж вона зможе оцінити будь-що, крім більш обмеженої версії себе.
EDIT: Читаючи це через день, я думаю, що "функція обгортки" є ключовою. Заготівля або часткове застосування найкраще змоделювати на Java методами обгортки.
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
Ланцюг методів може бути подібний до часткового нанесення або каррінгу, але він може бути еквівалентним лише методам, які повертають інші методи (шукайте функціонерів), і тоді методи повинні бути налаштовані з типом повернення, які змістовно моделюють currying або часткове застосування.
Ланцюжок методів частіше використовується для реалізації чогось подібного до ледачого оцінювання, як це робиться з дизайнерською схемою "Builder" та новими інтерфейсами бібліотеки колекцій на Java 8 .
Я сподіваюся, що це допомагає.