람다 언어는 무엇입니까?


90

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

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

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


6
Lambda는 익명의 표현을 의미합니다. 그래서 람다 언어-> 익명 표현의 언어
bevacqua

Google 도서 링크, FYI : books.google.co.uk/…
Lucas Jones

3
위키 백과에서 람다 미적분 을 참조하십시오 .
Oded

많은 좋은 답변. 내가 지금까지 이해 한 것은 익명 함수를 사용하고 있다면 람다 언어로 작업하고 있다는 것입니다. 자바와 같은 언어와 라마다 언어가 어떻게 다른지 정확하게 이해하는 것입니다.
sushil bharwani 2010 년

4
"저는 'JavaScript : The Good Parts'를 읽고 있었는데 저자는 JavaScript가 출시 될 람다 언어 중 첫 번째라고 언급했습니다." 나는 람다 언어를 봤 및 :) SO에이 질문에 발견 그래서
벅스 버니

답변:


38

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

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

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

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

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


내가 말하는 정확한 페이지로 이동하는 Lucas Jones Google 도서 링크가 게시 한 링크를 참조하십시오. 당신의 대답에 감사드립니다.
sushil bharwani 2010 년

5
JavaScript가 '첫 번째'라고 설명하는 이유는 문이 'to go mainstream'으로 한정되기 때문입니다. 자바 스크립트가 실제로 일상적인 작업에서 일상적인 프로그래머가 사용하는 최초의 함수형 언어라는 것이 꽤 분명하다고 생각합니다.
rfunduk

1
프로그래밍 언어의 "기능적 스타일"이란 무엇을 의미합니까? 나는 자바 배경 출신이며 자바 스크립트가 어떻게 다른지 배우려고합니다.
sushil bharwani 2010 년

9
탐험해야 할 거대한 주제입니다. 작년에 저는 지금 여러분이있는 곳이었습니다. 저는 Crockford의 에세이와 강의를 발견했고 마감을 이해하고 싶었습니다. 존 휴즈 "기능 프로그래밍의 중요성"나는 다음 몇 에세이로 이동, 당신은 위키 백과에서 시작 추천 할 것입니다 scribd.com/doc/26902/whyfp , 슬라바 Akhmechet "우리의 나머지 부분에 대한 기능 프로그래밍" defmacro.org/ramblings을 /fp.html 마음을 넓힐 수있는 책이 많이 있습니다. Little Schemer를 확인하여 Scheme에 대한 느낌을 얻은 다음 컴퓨터 프로그램의 구조 및 해석으로 이동하십시오.
michiakig 2010 년

5
@sushil : 주제에 대한 많은 소개 문헌이 있습니다. 그러나 일반적인 용어로, 이것은 프로그램을 추상적 인 객체 간의 순차적 명령이나 상호 작용이 아닌 수학적 객체로 취급하는 것을 강조하는 프로그래밍 스타일입니다. 예를 들어, 기능적 언어는 반복보다 재귀를 선호하고, 불변 데이터 구조를 사용하고, "함수 객체"또는 "전략 패턴"보다 우선 순위가 높은 함수를 사용합니다. 다른 함수에 대해 작동하거나 (인수로) 또는 (반환 값으로) 양보 할 수있는 함수를 의미하는 고차 함수.
Derrick Turk

48

간단히 말해서 람다 언어는 함수를 다른 함수로 전달할 수있는 언어입니다. 여기서 함수는 다른 변수로 처리됩니다. 또한 익명으로 (또는 인라인으로) 전달되도록이 함수를 정의 할 수 있어야합니다. 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 이전)에서 동일한 효과를 얻으려면 실제로 익명으로 인라인으로 정의 할 수있는 인터페이스를 구현하는 객체를 전달해야합니다.


1
누가 "Lisp를 널리 사용 했습니까?" 저는 교수님들이 항상 그것에 대해 논의 할 것이기 때문에 항상 그것에 대해 알고 있었지만 실제로는 Lisp를 사용한 사람을 만난 적이 없습니다. Javascript를 사용하는 사람을 아는 사람은 누구나 찾을 수 있으므로 Javascript를 훨씬 더 "주류"로 만듭니다.
palswim 2010 년

"PHP 5는 람다 함수에 대한 지원을 추가했습니다." 실제로는 람다 함수를 도입 한 PHP 5.3이었습니다.
Crozin 2010 년

비즈니스 맥락에서 사용한 사람은 거의 없지만 Pascal과 마찬가지로 교육 환경에서 널리 사용됩니다.
Juan Mendes

4

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

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

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


4

익명 함수와 함수에 대한 참조로 정의 된 람다를 보았습니다. 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));

코드 소스


1

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

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


0

위키 백과에서 : 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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.