이 글은 Yet Another Haskell Tutorial 내용 중 일부를 읽고 정리한 것이다.
람다 대수 Lambda Calculus는 함수를 표현하는 방식이다. 예를 들어 어떤 수 하나를 인자로 받아서 그 수를 제곱하는 함수를 람다 대수로 표현하면 다음과 같다.
λx.x*x
x
라는 이름의 인자를 받아서x
에x
를 곱하는 함수
람다 대수에서는 '함수에 값을 넣는다'고 표현하지 않고 '값에 적용한다 apply to value' 라고 표현한다.
위 식에 값 5
를 적용한다고 할 때 (λx.x*x) 5
- 먼저 모든
x
자리에5
를 대신 넣고λ5.5*5
.
과.
왼쪽에 있는λ5
부분을 지우면5*5
가 남고 결과는25
가 된다.
람다 대수에서 함수의 인자는 항상 한 개이다. 그럼 인자가 두 개인 함수는 람다 대수로 어떻게 표현할까? 인자 두 개를 받아서 첫 번째 인자에 2를 곱하고 그 값을 두 번째 인자에 더하는 함수는 람다 대수로 다음과 같이 표현한다.
λxλy.2*x+y
이 식에 값 5
와 4
를 넣으면 다음과 같이 결과로 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