메소드 당 하나의 매개 변수 만 필요한 체인 된 메소드는 카레와 동일합니까?


15

나는 최근 루비와 함께 놀았으며 순수한 객체 지향 언어 (그리고 순수하지 않은 언어)에서도 하나의 매개 변수 만 취한 다음 함께 연결되는 메서드를 만드는 것이 함수형 언어로 커링하는 것과 같은지 궁금합니다. 스타일? 그렇지 않다면 왜 안됩니까? 주제에 대해 자세하고 엄격한 답변을 부탁드립니다.

답변:


14

객체 지향 언어의 메소드 체인은 카레와 약간 다릅니다. 으로 정의 , 태닝의 결과는 본래의 더 제한된 형태의 기능 . 함으로써 협약 , 체인에있어서의 결과는 원 (일반적으로 비 작용)의 변형 형태 인 개체 . 메서드 체인은 같은 클래스에서 관련없는 메서드와 함께 사용할 수 있지만 카레에는 원래 함수의 하나 이상의 매개 변수가 고정 된 (사전 결정된) 함수를 반환하는 과정이 포함됩니다.

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 인터페이스에서 와 같이 지연 평가와 같은 것을 구현하는 데 더 자주 사용됩니다 .

도움이 되길 바랍니다.


+1 : 나는 그것을 알고 있었지만, 당신뿐만 아니라 어디에서나 그것을 분명히 말할 수는 없었습니다.
피터 로웰

잘 설명되어 있습니다. 여기에 녹색 확인 표시와 문제에 대한 공감대가 있습니다.
세계 엔지니어

StringBuilder의 아주 좋은 예에 대한 질문- toString()전화가 없으면 카레의 의도를 효과적으로 복제하지 못합니까? 나는 단지 OO에서 카레의 개념을 얻으려고 노력하고 있습니다.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat 커리 함수는 더 적은 수의 매개 변수를 가진 다른 함수를 반환합니다. 제거 된 매개 변수는 반환 된 함수에서 내부 상수로 바뀝니다. 일부 객체는 Java 8에서 함수처럼 취급되어 혼란을 줄 수 있지만 StringBuilder는 그중 하나가 아닙니다. 흠, StringBuilder 내 append(charSeq)에서 insert(destOffset, charSeq)함수 destOffset는 항상 StringBuilder의 길이 인 함수 의 커리 양식입니다 .
GlenPeterson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.