본문 바로가기
카테고리 없음

람다 표현식이란?

by Ziros 2022. 5. 31.
반응형

람다 식(또는 람다 함수)은 본질적으로 고차 함수를 지원하는 언어에서 변수에 할당하거나 인수로 전달하거나 함수 호출에서 반환할 수 있는 코드 블록입니다. 그들은 꽤 오랫동안 프로그래밍 언어의 일부였습니다. 몇 가지 예에는 Smalltalk, Lisp, Ruby, Scala, Python이 있으며 최근에는 Java 및 JavaScript가 있습니다. 여기 몇 가지 예가 있어요.

 

Python:

square = lambda x: x**2
square(6) //-> 36

Ruby:

square = lambda { |x| x * x }
square.(6) #-> 36

JavaScript (fat-arrow functions):

var square = x => x * x;
square(6) //-> 36

 

람다 표현식은 클로저 또는 블록이라고도 합니다. Ruby 코드를 자세히 보면 변수에 할당되고 실행되는 "호출 가능한" 코드 블록({ } 중괄호로 캡슐화됨)의 선언을 볼 수 있습니다. 람다 표현식은 주변 어휘 범위에서 상태에 액세스하기 때문에 클로저라고도 합니다. 이것은 C의 함수 포인터와도 다릅니다. 이 포인터는 전달할 수도 있지만 어휘 범위를 전달(또는 닫기)하지 않습니다.

대부분의 사람들은 람다를 단순히 익명의 함수로 인식하지만 더 자세히 연구하면(아마도 함수형 프로그래밍 관점에서) 람다 식은 생각보다 훨씬 더 많은 의미를 담고 있으며 훨씬 더 강력합니다. 이에 대해 좀 더 구체적으로 설명하기 위해 위에 표시된 JavaScript의 "화살표" 구문을 참조하겠습니다.

 

Syntax

가장 악명 높은 차이점은 구문에 있습니다. 람다 표현식은 기존의 익명 함수 선언에 비해 구문상의 이점을 제공합니다.

function (x) { return x * x };

함수  반환 키워드와 같은 몇 가지 아티팩트를 제거하여 이러한 표현식을 호출 가능한 코드 블록처럼 느끼게 합니다. 또한 이 구문은 map , reduce  filter 와 같은 고차 함수와 함께 사용할 때 코드를 훨씬 더 간결하게 만듭니다 .

range(1, 5).map(x => x * x); //-> [1, 4, 9, 16, 25]

 

Singularity

 

람다 식 사용의 이점은 단순한 구문 이상으로 확장됩니다. Lambdas는 소프트웨어 설계의 유명한 SOLID 원칙 중 첫 번째 원칙인 단일 책임 을 실천하도록 권장합니다 . 기능에 적용되는 단일 책임은 기능이 단일 목적을 가져야 함을 의미합니다. 람다 식에 여러 문을 포함할 수 있지만

 

(x, y) => {  // do something with x and y  
  // statement 1 
  // statement 2   
  return result;}

대부분의 사용법은 더 큰 표현식이나 컴포지션 내에서 함수 인수로 인라인되는 데서 파생됩니다(나중에 자세히 설명). 즉, 정확히 한 가지 작업을 수행하는 여러 개의 작은 람다 함수를 만들고 함께 결합하여 전체 프로그램을 구성할 수 있습니다.

range(1, 5)
   .filter(x => (x % 2) === 0)
   .map(x => x * x); //-> [4, 16]

그러나 이것이 왜 그렇게 중요한지 정말로 이해하려면 함수형 프로그래밍 관점에서 람다 식을 조사해야 합니다.

 

Pure Functions

함수형 프로그래밍은 함수를 순수한 수학적 관계 또는 유형 집합 간의 매핑으로 취급합니다. 이 경우 입력(도메인) 및 출력(범위 또는 공동도메인)의 집합입니다. 따라서 모든 기능을 유형 매핑으로 볼 수 있습니다. 예를 들어, 제곱 함수는 Number에서 Number 로의 매핑 입니다 .

 

Referential Transparency

순도의 개념을 참조 투명성이라는 수학적 원리로 확장할 수 있습니다. 이는 순수 함수가 사용되는 표현의 의미를 변경하지 않고도 항상 계산 가능한 값 으로 대체 될 수 있음을 의미합니다. 구체적인 예를 들어 sum 과 같은 순수 함수를 고려하십시오.

var size = (arr) => !arr ? 0 : arr.length;

그리고 함수 평균 :

var average = (arr) => Math.round(sum(arr) / size(arr))

[80, 90, 100]과 같은 입력의 경우 크기 는 일관되게 값 3을 반환합니다. 이 함수는 항상 동일한 입력에서 동일한 출력을 반환하기 때문에 참조 투명이라고 합니다. 실제로는 위의 전체 프로그램이 그렇습니다.  , 의미를 변경하지 않고 위 표현식의 값 3과 size(arr) 를 서로 바꿔서 사용할 수 있습니다. 이 수학적 품질은 우리 프로그램을 훨씬 더 쉽게 추론하고 주어진 입력에 대해 더 쉽게 추적할 수 있도록 합니다. 실제로 이들은 매우 간단한 기능이지만 개념은 가장 복잡한 알고리즘에도 동일하게 적용됩니다. 참조 투명성은 제공된 입력에만 기반하여 함수의 결과를 예측할 수 있기 때문에 함수를 진정한 블랙박스로 취급할 수 있음을 의미합니다.

결과적으로 참조 투명성에서는 인수가 없는 함수나 void 함수를 위한 공간이 없다는 것을 쉽게 알 수 있습니다. 수학적으로 말하자면, 이러한 경우 중 하나는 도메인 또는 코도메인에서 각각 빈 집합 "∅"을 의미합니다. 인수 목록 대신 빈 집합 표기법을 사용하는 다음 예를 살펴보세요.

var hello = () => console.log('Hello!');

무승부 함수 또는 무효 함수는 항상 부작용이 발생하고 있음을 암시합니다. 자체 범위 외부의 리소스에 액세스하지 않고는 다른 실제 작업을 수행할 수 없기 때문입니다. 람다 표현식은 이 매핑을 더 자세히 보여줍니다.

반응형

댓글