함수와 람다의 차이점은 무엇입니까?


54

나는 '기능'과 '람다'에 대해 약간 혼란스러워합니다. scheme 키워드 lambda가 JavaScript 키워드와 매우 유사하게 작동 한다는 것을 보여주는 몇 가지 예를 보았지만 function실제로 어떻게 관련되는지 모르겠습니다.

.net의 객체에 대해 말할 때 'function'과 'method'를 서로 바꿔 사용할 수 있다고 들었습니다. '람다'와 '기능'이 같은 의미인지 궁금합니다. 'lambda'에 난해한 의미가 있는지 궁금합니다. 그리스 문자 λ (λ)가이 사이트의 많은 아바타에 나타나는 것을 알 수 있습니다. .net에서 상황을 더욱 혼란스럽게 만들기 위해 C #의 기능 부분은 다른 함수에 전달 된 함수 표현식을 '람다 표현식'으로 지칭하므로 단어가 실제로 모든 곳에있는 것처럼 보입니다.

나는 또한 '람다 미적분학 (lambda calculus)'이라는 용어에 대해 모호하게 익숙하다.

함수와 람다의 차이점은 무엇입니까?


3
Nitpick-최소한 C # /. NET 문서가있는 한 "lambda 함수"가 아닌 "lambda 표현식"이라고합니다.
Oded

@ TWith2Sugars-메시지를 읽으십시오. 답변은 링크 일 뿐이므로 주석으로 변환되어 품질이 떨어집니다.
Oded

17
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.하나는 그것이 람다 미적분학과 관련되기를 희망하지만, Half Life 가 람다 아바타를 비난 하는 이상한 느낌 이 있습니다.
yannis

3
제법, 여기에 유래 답변에 대한 링크는 다음과 같습니다 stackoverflow.com/questions/16501/what-is-a-lambda-function
TWith2Sugars

@ZaphodBeeblebrox : 당신이 Half-Life 영향에 대해 맞다고 생각합니다. : /
FrustratedWithFormsDesigner

답변:


44

"lambda"또는 "lambda expressions"라는 단어는 대부분 익명 함수를 나타냅니다. 따라서 이런 의미에서 람다는 일종의 함수이지만 모든 함수가 람다 인 것은 아닙니다 (즉, 명명 된 함수는 일반적으로 람다라고하지 않습니다). 언어에 따라 익명 함수는 이름이 지정된 함수 (특히 익명 함수가 클로저이고 이름이 지정된 함수가 아닌 언어)와 다르게 구현되는 경우가 많으므로 다른 용어로 참조하는 것이 좋습니다.

scheme의 람다 키워드와 Javascript의 함수 키워드의 차이점은 후자가 익명 함수와 명명 된 함수를 생성하는 데 사용될 수 있고 전자는 익명 함수 만 생성하며 명명 된 함수를 생성하는 데 사용될 수 있다는 것 define입니다.

람다 미적분은 함수를 유일한 "데이터 구조"로 사용하는 최소한의 프로그래밍 언어 / 수학적 계산 모델입니다. lamdba 미적분학에서 람다 기호는 (익명) 함수를 만드는 데 사용됩니다. 다른 언어로 "lambda"라는 용어가 사용 된 곳입니다.


1
그것은 매우 거칠다. 당신이 사용 define(또는 let또는 친척, 또는 내부 정의) 이름을 만들 - 그게 다야. define기능과 관련하여 특별한 것은 없습니다 .
Eli Barzilay

2
@EliBarzilay 음, define 하지 (당신이 쓸 수있는 즉, 기능을 정의하기위한 특별한 형태가 (define (f x) (foo))대신을 (define f (lambda (x) (foo)))),하지만 내 포인트는 사용 명명 된 함수를 만들 수 있었다 lambda좋아, 혼자 당신이 뭔가를 쓸 수 없습니다 즉 (lambda f (x) (foo))라는 이름의 함수를 정의 fJavascript의 function키워드로 할 수있는 것처럼 하나의 논쟁이 필요 합니다.
sepp2k

1
define그것을 구문 설탕으로 사용하므로 모든 값에 대한 이름 바인딩 도구의 역할만큼 중요하지 않습니다. lambda이름 자체를 만들지 않는 것에 관해서는 : 그것은 기능 양식과 이름 제공을 분리하기 때문에 중요한 기능입니다 ... IMO JS는 분열을 허용하면서 옳은 일을하면서도 끔찍한 사람들에게 선택적 이름을 받아들입니다. 이름이없는 함수의 아이디어. (그리고 운 좋게도 그 대중의 크기는 일반적으로 감소하고 있습니다 ...)
Eli

18

람다는 단순히 익명의 함수입니다. 이름이없는 함수입니다.


4
참고 사항 : 람다는 닫는 것과 같이 선언 된 컨텍스트에서 걸리는 상태를 포함 할 수 있습니다.
Martin York

7
언어에서 중첩 함수를 선언 할 수 있으면 명명 된 함수도 가능합니다.
cHao

4
‘낮은 품질의 게시물’검토 탭에 의견을 올리는 것에 대한 의견.
yannis

@ZaphodBeeblebrox-의도적으로는 아니에요.
Oded

실제로 lambdaScheme의 function표현식은 이름이없는 표현식과 같지만 나중에 이름을 지정하는 것을 막을 수있는 것은 없습니다. 예를 들면 var f = [function(x){return x;}][0]. 함수 값 자체에는 이름이 없다고 주장 할 수 있지만 모든 함수에 해당됩니다.
Eli Barzilay


8

C #에서 익명 함수 는 람다 식과 익명 메서드를 모두 포함하는 일반적인 용어입니다 (익명 메서드는 실제 메서드 선언이없는 대리 인스턴스입니다).

람다 표현식 으로 나눌 수 있습니다 표현 람다문 람다

표현 람다 :

(int x, string y) => x == y.Length 

명령문 람다는 명령문이 중괄호로 묶여 있다는 점을 제외하면 표현식 람다와 유사합니다.

(int x, string y) => {
         if (x == y.Length) {
             Console.WriteLine(y);
         }
}

JavaScript에서 람다 식에 대해 이야기 할 때 기본적으로 다른 함수를 호출 할 때 함수를 인수로 사용하는 것을 의미합니다.

var calculate = function(x, y, operation){
    return operation(x, y);
}

// we're passing anonymous function as a third argument
calculate(10, 15, function(x, y) {
    return x + y;
}); // 25

+1 많은 사람들이 람다는 익명의 기능이지만 그보다 더 많은 기능이 있다고 언급했습니다. 람다의 본문 (오른쪽)은 종종 문장 블록이 아닌 표현 입니다. 표현식 인 명명 된 함수의 본문은 일반적으로 기능적 언어에서는 허용되거나 필수이지만 필수 언어는 아닙니다.
Zantier

4

TL; DR 다른 사람들이 지적했듯이, 람다 표기법은 이름을 지정하지 않고 함수를 정의하는 방법 일뿐입니다.

긴 버전

이 주제에 대해 좀 더 자세히 설명하고 싶습니다. 면책 조항 : 나는 오래 전에 람다 미적분학 과정을 수강했습니다. 더 나은 지식을 가진 사람이 내 대답에 부정확 한 것을 발견하면, 그것을 향상시키는 데 도움을 주시기 바랍니다.

예를 들어 1 + 2및 식으로 시작해 봅시다 x + 2. 상수1 와 같은 리터럴 은 특정 고정 값에 바인딩되므로 상수2 라고 합니다.

변수 와 같은 식별자를 변수x 라고 하며이를 평가하려면 먼저 일부 값에 바인딩해야합니다. 그래서, 기본적으로는 평가할 수없는 당신이 모르는만큼 이다.x + 1x

람다 표기법은 특정 입력 값을 변수에 바인딩하기위한 스키마를 제공합니다. 람다 식을 추가함으로써 형성 될 수있다 λx .예를 들어, 기존의 발현 전면에 λx . x + 1. 변수는 x이라고합니다 무료 에서 x + 1바인딩λx . x + 1

이것이 표현식 평가에 어떻게 도움이됩니까? 람다 식에 값을 입력하면

(λx . x + 1) 2

그런 다음 변수의 모든 발생을 x값 2 로 대체 (바인딩)하여 전체 표현식을 평가할 수 있습니다 .

(λx . x + 1) 2
      2 + 1
      3

따라서 람다 표기법은 식 / 프로그램 블록에 나타나는 변수에 사물을 바인딩하는 일반적인 메커니즘을 제공합니다. 상황에 따라 프로그래밍 언어에서 크게 다른 개념을 만듭니다.

  • Haskell과 같은 순전히 기능적인 언어에서 람다 식은 수학적인 의미로 함수 를 나타냅니다 . 입력 값이 람다의 본문에 주입되고 출력 값이 생성됩니다.
  • 람다 식의 본문을 평가하는 많은 언어 (예 : JavaScript, Python, Scheme)에서 부작용이있을 수 있습니다. 이 경우 프로 시저 라는 용어를 사용 하여 차이 wrt 순수 함수를 표시 할 수 있습니다 .

차이점을 제외하고 람다 표기법은 형식 매개 변수를 정의하고 실제 매개 변수에 바인딩하는 것에 관한 것입니다.

다음 단계는 함수 / 프로 시저에 이름을 지정하는 것입니다. 여러 언어에서 함수는 다른 것과 같은 값이므로 함수에 다음과 같이 이름을 지정할 수 있습니다.

(define f (lambda (x) (+ x 1)))      ;; Scheme

f = \x -> x + 1                      -- Haskell

val f: (Int => Int) = x => x + 1     // Scala

var f = function(x) { return x + 1 } // JavaScript

f = lambda x: x + 1                  # Python

Eli Barzilay가 지적했듯이 이러한 정의는 이름 f을 값에 바인딩 하기 때문에 함수가됩니다. 따라서이 점에서 함수, 숫자, 문자열, 문자는 모두 같은 방식으로 이름에 바인딩 할 수있는 값입니다.

(define n 42)   ;; Scheme

n = 42          -- Haskell

val n: Int = 42 // Scala

var n = 42      // JavaScript

n = 42          # Python

이러한 언어에서는보다 친숙하지만 동등한 표기법을 사용하여 함수를 이름에 바인딩 할 수도 있습니다.

(define (f x) (+ x 1))         ;; Scheme

f x = x + 1                    -- Haskell

def f(x: Int): Int = x + 1     // Scala

function f(x) { return x + 1 } // JavaScript

def f(x): return x + 1         # Python

C와 같은 일부 언어는 (명명 된) 함수를 정의하기위한 후자의 표기법 만 지원합니다.

폐쇄

폐쇄 에 관한 최종 관찰 . 표현을 고려하십시오 x + y. 여기에는 두 개의 자유 변수가 포함됩니다. x람다 표기법을 사용하여 바인딩 하면 다음과 같은 결과가 나타납니다.

\x -> x + y

이것은 여전히 ​​free 변수를 포함하고 있기 때문에 (아직) 함수가 아닙니다 y. 바인딩 y을 통해 함수를 만들 수도 있습니다.

\x -> \y -> x + y

또는

\x y -> x + y

+기능 과 동일 합니다.

그러나 y다른 방법으로 (*) 바인딩 할 수 있습니다 .

incrementBy y = \x -> x + y

함수 incrementalBy를 숫자에 적용한 결과는 클로저, 즉 바디 y에 클로저가 정의 된 환경의 값에 바인딩 된 자유 변수 (예 :)가 포함 된 함수 / 프로 시저입니다 .

incrementBy 5숫자를 5 씩 증가시키는 함수 (클로저)도 마찬가지 입니다.

노트 (*)

나는 여기에 약간의 바람을 피우고있다 :

incrementBy y = \x -> x + y

에 해당

incrementBy = \y -> \x -> x + y

바인딩 메커니즘은 동일합니다. 직관적으로 클로저는 더 복잡한 람다 식의 덩어리를 나타내는 것으로 생각합니다. 이 표현이 작성되면 모체 표현식의 일부 바인딩이 이미 설정되어 있으며 나중에 평가 / 호출 될 때 클로저가이를 사용합니다.


나는 단지 구걸 자이지만 수학적 의미에서 λ 미적분학을 이해하려고한다면 이것이 다소 혼란 스러울 수 있다고 생각합니다. 상수라고하는 것은 변수라고하고 기호 a, b, c로 표시되기 때문에 당신은 무엇입니까? 호출 변수는 결정되지 않은 변수 x 입니다. 반면에 1은 λ f x 입니다. f x , 2는 λ f x 입니다. f ( f x ) 등.
jinawee

@ jinawee : 나는 정확한 정의를 찾지 않았다는 것을 인정한다. 논리에서 변수와 상수라는 용어를 사용하는 것을 기억합니다. 여기서 상수는 도메인에 매핑 된 심볼이고 변수는 수량화 할 수있는 심볼입니다. 그러나 다시 한 번, (1) 논리에 관한 과정을 수강 한 지 오래되었습니다. (2) 람다 미적분학은 1-1 수학 논리의 개념을 따를 필요가 없습니다. 당신이 나를 참조로 지적한다면 나는 내 용어를 시도하고 고칠 수 있습니다.
조르지오

0

프로그래밍에서 "Lambda"는 일반적으로 "lambda function"(또는 "lambda expression", "lambda term")을 의미합니다. function이 사용 전에 정의 된 명명 된 코드 블록 인 경우 "lambda function"은 프로그래밍 언어에서 일급 시민으로 사용될 수있는 사용 대신 정의 된 코드 블록 (또는 표현식)입니다.

JavaScript ES6 (2015)에는 "Arrow Functions" 라는 람다를 정의하는 간단한 구문이 있습니다. C #에서 이러한 구문 은 .NET 3.0 (2006 년경)에 도입되었습니다 .

수학에서 "함수"개념은 몇 가지 의미를 지니 며, 그중 하나의 의미는 함수 표기법 (즉, 그것을 기록하는 방법)에 관한 것입니다. 그런 다음 "람다 함수"(미적분학)는 특수한 종류의 함수 표기법입니다. 자세한 내용 은 프로그래밍 언어에서 람다 함수를 확인하십시오 .

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