본문 바로가기

Development

함수형 프로그래밍 1 - 함수 합성

 

  • 이글은 황대산님의 블로그에서 복사한 글입니다.

 

함수형 프로그래밍 1 - 함수 합성

 

함수형 프로그래밍이란 함수를 연산의 대상으로 삼는 프로그래밍 패러다임을 말한다. 수학의 함수를 떠올리면 되는데, 우선 다음의 예를 살펴보자.

f(x) = x + 3
g(x) = x^2
h = g * f

위에서 함수 h는 함수 f와 g를 합성한 새로운 함수이다. 이제 함수 h는 다음과 같게 정의된 것이나 마찬가지이다.

h(x) = g(f(x)) = (x + 3)^2 = x^2 + 6x + 9

루비는 객체지향 언어지만, 동시에 함수형 프로그래밍 언어이기도 하다. 이제 루비에서 함수 f와 g를 정의한 후, 이를 합성하여 함수 h를 만드는 과정을 살펴보도록 하자. 루비에서 함수를 정의할때는 lambda란 메소드를 사용한다. (여기에서 말하는 함수란 물론 Proc 객체를 말한다. 일반 메소드와 구분하기 위해 여기에서는 함수라는 표현을 사용하고 있다.)

f = lambda {|x| x + 3}
g = lambda {|x| x ** 2}

이제 함수 f와 g를 결합할 차례인데, 이를 위해서는 다음의 코드를 먼저 선언해 주어야 한다. [1]

class Proc
def *(func)
lambda {|*a| self[func[*a]]}
end
end

위의 코드는 함수 간의 연산인 *를 정의하는데, 이 연산이 바로 함수를 합성하는 연산이다. (위의 코드는 Proc 객체에 * 메소드를 추가하고 있다.) 이제 루비에서 다음과 같은 코드를 작성할 수 있게 된다.

h = g * f

이제 irb에서 실제로 코드를 입력해보자.

>> class Proc
>> def *(func)
>> lambda {|*a| self[func[*a]]}
>> end
>> end
=> nil
>> f = lambda {|x| x + 3}
=> #<Proc:0x0051d3f8@(irb):6>
>> g = lambda {|x| x ** 2}
=> #<Proc:0x0051a978@(irb):7>
>> h = g * f
=> #<Proc:0x0051ff2c@(irb):3>
>> f[2]
=> 5
>> g[5]
=> 25
>> h[2]
=> 25

위에서 'f[2]'는 루비에서 함수를 호출할때 사용하는 방식이다. 이 표현 대신 'f.call(2)'를 사용하는 것 또한 가능하다.

  1. Proc 클래스의 * 메소드의 구현은 Ruby Facets 라이브러리를 참고하고 있음.

관련글: 함수형 프로그래밍 2 - 커링

 

이 글은 스프링노트에서 작성되었습니다.

'Development' 카테고리의 다른 글

Ruby for Impatient Nuby  (0) 2008.02.07
함수형 프로그래밍 2 - 커링  (0) 2008.02.07
루비가 쿨한 이유 3 - 해시  (0) 2008.02.07
루비가 쿨한 이유 2 - 블록  (0) 2008.02.07
루비가 쿨한 이유 1 - irb  (0) 2008.02.07