function - 콜백 - 함수형 프로그래밍 클로저




'클로저'와 '람다'의 차이점은 무엇입니까? (8)

간단히 말하면, 클로저는 범위에 대한 속임수이며, 람다는 익명의 함수입니다. 우리는 람다를 더 우아하게 닫을 수 있고 람다는 더 높은 함수에 전달 된 매개 변수로 자주 사용됩니다

누군가 설명 할 수 있을까요? 나는 그 뒤에있는 기본 개념을 이해하지만, 나는 종종 그것들을 서로 바꾸어 사용하는 것을 보았고 나는 혼란스러워합니다.

그리고 우리가 여기에 왔을 때, 그들은 일상적인 기능과 어떻게 다른가요?


개념은 위에서 설명한 것과 같지만 PHP 배경을 사용하는 경우 PHP 코드 사용에 대해 더 자세히 설명합니다.

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, function ($v) { return $v > 2; });

function ($ v) {return $ v> 2; }는 람다 함수 정의입니다. 변수에 저장할 수도 있으므로 재사용 할 수 있습니다.

$max = function ($v) { return $v > 2; };

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max);

이제 필터링 된 배열에 허용되는 최대 수를 변경하려면 어떻게해야합니까? 다른 람다 함수를 작성하거나 클로저를 생성해야합니다 (PHP 5.3).

$max_comp = function ($max) {
  return function ($v) use ($max) { return $v > $max; };
};

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max_comp(2));

클로저는 함수가 호출 될 때 액세스 할 수있는 하나 이상의 바인딩 된 변수가있는 자체 환경에서 평가되는 함수입니다. 그것들은 여러 가지 개념이있는 기능적 프로그래밍 세계에서 왔습니다. 클로저는 람다 함수와 비슷하지만 클로저가 정의 된 외부 환경의 변수와 상호 작용할 수 있다는 점에서 더 똑똑합니다.

다음은 PHP 클로저의 간단한 예제입니다.

$string = "Hello World!";
$closure = function() use ($string) { echo $string; };

$closure();

이 기사에서 멋지게 설명했다.


람다는 이름없는 함수로 정의 된 함수입니다. 클로저는 정의 된 환경에서 닫히는 함수입니다. 즉, 매개 변수 목록에없는 변수에 액세스 할 수 있습니다.


모든 폐쇄가 람다는 아니며 모든 람다가 폐쇄는 아닙니다. 둘 다 기능이지만 꼭 익숙하지 않은 방식 일 필요는 없습니다.

lambda는 기본적으로 함수를 선언하는 표준 방법이 아니라 인라인으로 정의 된 함수입니다. 람다는 종종 객체로 전달 될 수 있습니다.

클로저는 몸의 외부 필드를 참조하여 주변 상태를 둘러싼 함수입니다. 닫힌 상태는 클로저의 호출을 가로 질러 유지됩니다.

객체 지향 언어에서 클로저는 일반적으로 객체를 통해 제공됩니다. 그러나 일부 OO 언어 (예 : C #)는 상태를 묶을 객체가없는 순수 함수형 언어 (예 : lisp)가 제공하는 클로저의 정의에 더 가까운 특수 기능을 구현합니다.

흥미로운 점은 C #에서 Lambdas 및 Closure를 도입하면 함수 프로그래밍을 주류 사용에 더 가깝게 만듭니다.


이 질문은 오래되었고 많은 답을 얻었습니다. 이제 비공식 클로저 프로젝트 인 Java 8 및 Official Lambda를 사용하면 질문이 다시 생깁니다.

Java 문맥에서의 답변 ( Lambdas와 클로저 를 통해 - 차이점은 무엇입니까? ) :

클로저 (closure)는 자유 변수 각각을 값에 바인딩하는 환경과 짝을 이루는 람다 식으로, Java에서는 람다식이 클로저 (closure)에 의해 구현되므로이 두 용어는 커뮤니티에서 상호 교환 가능하게 사용됩니다. "


이것은 다음과 같이 간단합니다 : lambda는 언어 구조입니다. 즉, 익명 함수에 대한 구문입니다. 클로저는 이름 그대로 또는 익명으로이 기능을 구현하는 기술 또는 모든 일류 함수를 의미합니다.

보다 정확하게 말해, 클로저는 일류 함수 가 런타임시 해당 코드에서 사용되는 모든 비 로컬 변수에 대해 "코드"와 "닫는"한 쌍으로 표현되는 방식입니다. 이 방법은 변수가 이미 생성 된 외부 범위가 이미 종료 된 경우에도 해당 변수에 계속 액세스 할 수 있습니다.

불행하게도 함수를 일류 가치로 지원하지 않거나 장애가있는 형태로만 지원할 수있는 언어가 많이 있습니다. 그래서 사람들은 종종 "진짜"를 구별하기 위해 "폐쇄"라는 용어를 사용합니다.


함수가 외부 변수를 사용하여 연산을 수행하는지 여부에 따라 달라집니다.

외부 변수 - 함수의 범위 밖에 정의 된 변수.

  • 람다 식은 매개 변수, 내부 변수 또는 상수를 사용하여 연산을 수행하기 때문에 무 상태 입니다.

    Function<Integer,Integer> lambda = t -> {
        int n = 2
        return t * n 
    }
    
  • 클로저는 외부 변수 (즉, 함수 본문 범위 외부에서 정의 된 변수)와 매개 변수 및 상수를 사용하여 작업을 수행하기 때문에 상태를 유지 합니다.

    int n = 2
    
    Function<Integer,Integer> closure = t -> {
        return t * n 
    }
    

자바가 클로저를 생성 할 때 변수 n을 함수와 함께 유지하므로 다른 함수로 전달되거나 참조가 될 수 있습니다.


람다 는 익명의 함수입니다 - 이름없이 정의 된 함수. Scheme과 같은 일부 언어에서는 명명 된 함수와 동일합니다. 실제로 함수 정의는 람다를 내부적으로 변수에 바인딩하는 것으로 다시 작성됩니다. 파이썬과 같은 다른 언어에서는 두 언어 사이에 약간의 (불필요한) 차이점이 있지만 다른 방식으로는 똑같은 방식으로 동작합니다.

클로저 는 정의 된 환경 에서 닫히는 모든 함수입니다. 즉, 매개 변수 목록에없는 변수에 액세스 할 수 있습니다. 예 :

def func(): return h
def anotherfunc(h):
   return func()

이것은 funcanotherfunc h 의 환경에서 닫히지 않기 때문에 오류가 발생합니다. 정의되지 않았습니다. func 는 전역 환경에서만 닫힙니다. 이것은 작동 할 것이다 :

def anotherfunc(h):
    def func(): return h
    return func()

왜냐하면 funcanotherfunc 정의되어 있고 파이썬 2.3 이상 (또는 이와 비슷한 숫자)에서 클로저가 거의 정확할 때 (돌연변이가 여전히 작동하지 않는 경우), 이는 anotherfunc 의 환경에서 닫히고 액세스 할 수 있음을 의미합니다 그것의 내부 변수. Python 3.1 이상 에서 nonlocal 키워드를 사용할 때 돌연변이가 작동 합니다 .

또 다른 중요한 점은 funcanotherfunc 에서 더 이상 평가되지 않을 때에도 anotherfunc 의 환경을 계속 닫을 것입니다. 이 코드도 작동합니다.

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

그러면 10이 인쇄됩니다.

이것은 알다시피, 람다 와 아무런 관련이 없습니다. 두 가지 (비록 관련성이 있지만) 개념입니다.





closures