[javascript] 람다 언어는 무엇입니까?

필자는 “JavaScript : The Good Parts”를 읽고 있었는데 저자는 JavaScript가 처음으로 출시 될 람다 언어라고 언급했습니다.

JavaScript의 함수는 (대부분) 어휘 범위가있는 일급 객체입니다. JavaScript는 주류 가 된 최초의 람다 언어 입니다. 깊은 곳에서 JavaScript는 Java보다 Lisp 및 Scheme과 더 많은 공통점이 있습니다. C의 옷을 입은 Lisp입니다. 이로 인해 JavaScript는 매우 강력한 언어입니다.

나는 람다 언어가 무엇인지 이해하지 못했습니다. 이러한 언어의 속성은 무엇이며 Java, C, C ++ 및 Php와 같은 언어와 어떻게 다른가요?



답변

나는 누구도 “람다 언어”라는 용어를 사용하는 것을 들어 본 적이 없으며, 내가 생각할 수있는 유일한 그럴듯한 정의는 자바 스크립트를 “첫 번째”로 제외하는 것입니다.

즉, 다음 중 하나를 의미 할 수 있습니다.

  • 기능적 언어 : 계산이 (아마도 고차) 함수의 상태 비 저장 구성으로 모델링되거나 모델링 될 수있는 언어 클래스입니다. LISP, Scheme, ML, Haskell 등은 자주이 클래스에 속하지만 이들 중 일부는 더 적절하게 혼합 된 패러다임 또는 “기능적 선택적”언어입니다. 자바 스크립트는 “기능적 스타일”의 프로그래밍을 가능하게하는 데 필요한 기능을 포함하고있을 것입니다.
  • 익명 함수의 생성을 허용하는 언어 ( functionJavaScript 의 구문 사용 . 이것은 lambda많은 언어로 작성 되므로 “람다 언어”일 수 있음).

두 가지 사용 모두 람다 미적분, Alonzo 교회가 고안 한 계산 모델 및 함수 프로그래밍의 기반이되는 계산 모델에서 함수 추상화를 나타내는 그리스 문자 람다의 사용에서 파생됩니다.

편집 : Google 도서 결과를 살펴 보았습니다 .– “첫 번째 주류로 이동”; 글쎄, 그것은 논쟁의 여지가 있습니다. 나는 LISP가 적어도 합리적으로 주류 였다고 주장했다. 그래도 JavaScript의 의미 체계는 Scheme에서 직접 영감을 받았으며 유사한 주장을 할 수있는 다른 어떤 언어보다 더 많은 청중에게 확실히 도달했습니다.


답변

간단히 말해서 람다 언어는 함수를 다른 함수로 전달할 수있는 언어입니다. 여기서 함수는 다른 변수로 처리됩니다. 또한 익명으로 (또는 인라인으로) 전달되도록이 함수를 정의 할 수 있어야합니다. PHP 5.3은 람다 함수에 대한 지원을 추가했습니다. JavaScript가 최초의 주류 언어였습니까? Lisp는 JavaScript 이전의 교육 환경에서 널리 사용되었으며 우리가 사랑하는 Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/ 을 사용자 정의하는 데에도 사용되었습니다 .

여기에 예가 있습니다.

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

C와 어떻게 다른가요? C에서는 함수에 대한 포인터를 전달할 수 있지만 익명으로 인라인으로 정의 할 수는 없습니다.

Java (버전 8 이전)에서 동일한 효과를 얻으려면 실제로 익명으로 인라인으로 정의 할 수있는 인터페이스를 구현하는 객체를 전달해야합니다.


답변

그는 Lambda 미적분을 언급합니다 .

λ-calculus라고도하는 Lambda 미적분은 함수 정의, 함수 적용 및 재귀를위한 공식 시스템입니다. […]

[…] 형식화되지 않은 람다 미적분은 함수형 프로그래밍, 특히 Lisp에 대한 원래 영감이되었으며, 최신 형식 시스템의 기초 역할을하는 형식화 된 람다 미적분입니다.


답변

익명 함수와 함수에 대한 참조로 정의 된 람다를 보았습니다. Javascript는 다음을 모두 지원합니다.

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

이것은 JS가 많은 힘과 유연성을 얻는 곳입니다. Java는 첫 번째 (익명 인터페이스 구현)를 어느 정도 지원 하지만 후자는 지원하지 않습니다 . Java 8에 대한 업데이트는 아래를 참조하십시오.

이것들 중 어느 (또는 둘 다)이 람다의 적절한 정의인지 나에게 명확하지 않습니다.

JS는 이러한 기능을 지원하는 첫 번째 언어가 아닙니다. 기억에서, 나는 언어 애호가들이 항상 람다를 지원하는 것에 대해 열광하는 소문이라고 생각합니다.

BTW : Java에서 익명 클래스는 일반적으로 인수에 대한 클래스 정의를 즉시 전달하는 데 사용됩니다 (스윙에서 많이 사용됨). 다음과 같은 것 (컴파일되지 않은 메모리에서) :

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

최신 정보

8부터 Java는 이제 공식적으로 Lambda 언어입니다.

이제 다음 구문을 사용할 수 있습니다.

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

코드 소스


답변

컴퓨터 프로그램의 구조 및 해석이라고하는 MIT의 공개 코스웨어에서 Hal Abelson, Jerry Sussman 및 Julie Sussman의 책이 있습니다. 그들은 LISP의 방언 인 Scheme에 대해 논의하고 거기에서 람다가 무엇인지, Scheme LISP와 일반적인 언어에 대한 매우 상세하고 명확한 설명을 설명합니다. 컴퓨터 프로그래밍에 대한 명확하고 깊은 이해를 원하신다면 꼭 한번 보시길 권합니다. 설명하기 위해서는 마치 거기에 가서 책을 읽거나 완벽하게 설명하는 튜토리얼을 보는 것보다 세 배 더 많은 시간이 소요될 것입니다. 그것은 천재입니다.

Javascript는 주로 언어 체계를 기반으로하며 Lisp의 아버지이며, 또한 람다 구조를 채택하여 주류가되었습니다.


답변

위키 백과에서 : Lisp 및 Python과 같은 프로그래밍 언어에서 lambda는 람다 계산법 사용에 따라 익명 함수 또는 클로저를 나타내는 데 사용되는 연산자입니다. Python 언어에서 람다를 사용하는 예는 각 항목의 마지막 문자를 기준으로 알파벳순으로 목록을 정렬하는 컴퓨터 코드 섹션입니다.

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements


답변

  • JavaScript는 식별자에 바인딩되지 않은 함수 인 익명 함수를 정의 할 수 있습니다. 이러한 함수는 Lambda Abstraction이라고도하며 JS가이를 지원하므로 Lambda 언어라고합니다.

  • 속성 :이 함수는 함수를 즉시 실행하거나 함수에 이름을 부여하는 것의 의미가없는 단기간 사용하는 경우 필요합니다.

  • 자바, C, C ++, PHP 같은 언어와는 다릅니다. JS 익명 함수는 Closure와 Currying에 사용됩니다.