함수형 프로그래밍 2 - 커링

Posted by 大山 Sat, 24 Feb 2007 07:20:00 GMT

[참고: 이 글은 함수형 프로그래밍 1 - 함수 합성에 이어지는 시리즈임.]

앞 글에서는 두개 이상의 함수를 합성하여 새로운 함수를 만드는 방법을 살펴보았다. 이번 글에서는 함수에서 일부 인자의 값을 고정하여 새로운 함수를 만드는 커링(Currying) 기법을 다뤄본다. 우선 다음의 함수를 살펴보자.

f(x, y) = x^2 + y^2
g(y) = f(0, y) = y^2
 

위에서 함수 f는 x, y 두개의 인자를 가지는 함수이다. 함수 g는 함수 f에서 첫번째 인자의 값을 상수로 고정시켜 만든 새로운 함수이다. 이처럼 함수 f에서 일부 인자의 값을 상수로 고정시켜 새로운 함수 g를 만드는 과정을 커링이라고 부른다. (그래프로 보면, z = y^2 그래프의 모습은 z = x^2 + y^2 그래프와 x = 0 그래프가 만나는 단면의 모습이다.)

루비에서 함수 f, g는 다음과 같이 정의할 수 있다.

f = lambda {|x, y| x**2 + y**2}
g = f[0]
 

하지만 실제로 위의 코드를 실행하면, 두번째 줄에서 함수 f의 인자 개수가 틀리다는 에러가 발생하게 된다. 루비의 함수 호출은 커링 기능을 지원하지 않기 때문이다. 루비에 커링 기능을 추가하기 위해서는 다음의 코드가 필요하다. (이 코드는 Proc 클래스의 [ ] 메소드를 새롭게 정의하고 있다.)

class Proc
  def [](*a)
    if arity > a.size
      lambda {|*b| self[*(a+b)]}
    else
      self.call(*a)
    end
  end
end
 

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

>> class Proc
>>   def [](*a)
>>     if arity > a.size
>>       lambda {|*b| self[*(a+b)]}
>>     else
?>       self.call(*a)
>>     end
>>   end
>> end
=> nil
>> f = lambda {|x, y| x**2 + y**2}
=> #<Proc:0x010abc10@(irb#1):10>
>> g = f[0]
=> #<Proc:0x010af310@(irb#1):4>
>> f[0, 5]
=> 25
>> g[5]
=> 25
 

Posted in  | Tags , ,  | 6 comments | no trackbacks

Comments

  1. 1.
    정호경 said 1 day later:

    Currying 기법

    하스켈로 한번 배우긴 햇는데

    어렵다고 생각보다는 루비를

    배우적이 없어서 다시 보니 이해가

    어렵네요;;

    커링이 결국 함수에서 함수가 불려진다는

    개념으로 문득 생각이나는데.

    맞는지가 참 ㅎㅎㅎ


  2. 2.
    大山 said 1 day later:

    @정호경: 막상 글에서 커링이 무엇인지를 설명하는 문장이 없었네요. 내용을 조금 수정했으니 다시 한번 읽어보세요. :)


  3. 3.
    passer by said 3 days later:

    전혀 다른 얘긴데 오른쪽 'Tags'에 있는 태그들의 크기나 갯수의 선택 기준이 어떻게 되나요? 그냥 궁금해서요^^


  4. 4.
    민서대디 said 4 days later:

    @passer by: 음, 그냥 소스만 봤을때는 tag count들를 가져와서 평균에 해당하는 tag크기를 정하고, 나머지는 평균에 비례해서 %로 주면 알아서 저렇게 나오지 않을까요? ㅋㅋ <li> 와 css에서 약간의 작업을 하면 가로로 나오게 되니깐 저런식으로도 알아서 나올 것 같습니다. 막상 해보면 아닐지도 모르지만..^^ 자세한 사항은 쥔장님이 개인적으로 알려주지 않을까요? 어제는 이 blog가 접속이 안되더니 오늘은 잘 되네요..^^


  5. 5.
    민서대디 said 4 days later:

    댓글에 html 태그를 쓰니깐 이상하게 저장되네요..[li] 태그를 썼더니 한줄이 없어지네요.. "와 css에서" 는 "li tag 와 css에서" 입니다. 아무래도 꺽쇠가 들어가면서 이상하게 저장된것 같은데..^^ 죄송합니다..물의를 일으켜서..


  6. 6.
    大山 said 5 days later:

    @passer by: 가장 많이 사용된 20개 태그를, 사용 빈도에 따라 폰트 크기를 %로 잡아주고 있습니다.

    @민서대디: HTML 태그 입력이 문제가 되는군요. 기본 포맷은 마크다운(Markdown)으로 하고 있습니다만, HTML이 escape되게 만들어야 겠네요. :)


Trackbacks

Use the following link to trackback from your own site:
http://beyond.daesan.com/articles/trackback/15512

Comments are disabled