답변:
객체 지향 언어의 메소드 체인은 카레와 약간 다릅니다. 으로 정의 , 태닝의 결과는 본래의 더 제한된 형태의 기능 . 함으로써 협약 , 체인에있어서의 결과는 원 (일반적으로 비 작용)의 변형 형태 인 개체 . 메서드 체인은 같은 클래스에서 관련없는 메서드와 함께 사용할 수 있지만 카레에는 원래 함수의 하나 이상의 매개 변수가 고정 된 (사전 결정된) 함수를 반환하는 과정이 포함됩니다.
Java에서 메소드 체인은 다음과 같습니다.
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
따라서 각 .append () 메서드 호출은 익명의 StringBuilder 객체에 대한 포인터를 반환합니다. 이 객체는 각 .append () 후에 완료되며 함수가 아닙니다.
반대로 스칼라에서 부분 적용 또는 카레는 다음과 같습니다.
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에서 카레 또는 부분 애플리케이션을 가장 잘 시뮬레이션 할 수 있습니다.
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
메소드 체인은 부분 적용 또는 커리와 유사 할 수 있지만 다른 메소드를 리턴하는 메소드 (Functors 조회)와 동일 할 수 있으며, 메소드는 커리 또는 부분 적용을 의미있게 모델링하는 리턴 유형으로 설정해야합니다.
메소드 체인은 "Builder"디자인 패턴과 Java 8 의 새로운 Collections Library 인터페이스에서 와 같이 지연 평가와 같은 것을 구현하는 데 더 자주 사용됩니다 .
도움이 되길 바랍니다.
toString()
전화가 없으면 카레의 의도를 효과적으로 복제하지 못합니까? 나는 단지 OO에서 카레의 개념을 얻으려고 노력하고 있습니다.
append(charSeq)
에서 insert(destOffset, charSeq)
함수 destOffset
는 항상 StringBuilder의 길이 인 함수 의 커리 양식입니다 .