Skip to content

Instantly share code, notes, and snippets.

@nattybear
Last active July 14, 2021 07:38
Show Gist options
  • Save nattybear/8c99c68c3acdfa8a952f9b804c810e94 to your computer and use it in GitHub Desktop.
Save nattybear/8c99c68c3acdfa8a952f9b804c810e94 to your computer and use it in GitHub Desktop.
하스켈 람다 대수

이 글은 Yet Another Haskell Tutorial 내용 중 일부를 읽고 정리한 것이다.

람다 대수

람다 대수 Lambda Calculus는 함수를 표현하는 방식이다. 예를 들어 어떤 수 하나를 인자로 받아서 그 수를 제곱하는 함수를 람다 대수로 표현하면 다음과 같다.

λx.x*x
  • x라는 이름의 인자를 받아서
  • xx를 곱하는 함수

람다 대수에서는 '함수에 값을 넣는다'고 표현하지 않고 '값에 적용한다 apply to value' 라고 표현한다.

위 식에 값 5를 적용한다고 할 때 (λx.x*x) 5

  • 먼저 모든 x 자리에 5를 대신 넣고 λ5.5*5
  • .. 왼쪽에 있는 λ5 부분을 지우면
  • 5*5가 남고 결과는 25가 된다.

람다 대수에서 함수의 인자는 항상 한 개이다. 그럼 인자가 두 개인 함수는 람다 대수로 어떻게 표현할까? 인자 두 개를 받아서 첫 번째 인자에 2를 곱하고 그 값을 두 번째 인자에 더하는 함수는 람다 대수로 다음과 같이 표현한다.

λxλy.2*x+y

이 식에 값 54를 넣으면 다음과 같이 결과로 14가 나온다.

(λxλy.2*x+y) 5 4
(λ5λy.2*5+y) 4
(λy.10+y) 4
λ4.10+4
10+4
14

하스켈 함수의 평가 방식은 람다 대수와 같다. λ\로 바꾸고 .->로 바꾸면 하스켈 코드가 된다.

\x -> x * x

아래처럼 람다 식에 함수 이름을 지어줄 수 있다.

square = \x -> x * x
f = \x y -> 2 * x + y

REPL에서 아래와 같이 계산해볼 수도 있다.

ghci> (\x -> x * x) 5
25
ghci> (\x y -> 2 * x + y) 5 4
14

대문 링크

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment