gimmesilver's blog

Agbird.egloos.com

포토로그



하스켈 커리 함수 작성 팁 하스켈 스프링노트

Functional Programming Idiom: Plan for Currying 

하스켈 네트워크 프로그래밍...3 에서 커리 함수에 대해 간단하게 소개했었는데 마침 커리 함수 관련된 팁이 dzone.com 에 올라왔길래 소개합니다.(이것 역시 일종의 지역성의 원리가 아닐런지...^^)
요약하자면 커리 함수 작성 시 재사용성을 높이려면 중요한 매개변수를 뒤에 배치해야 한다는 것입니다. 보통 C 나 C++ 에서는 반대로 중요하지 않은 매개 변수를 뒤에 배치합니다. 왜냐하면 그렇게 하면 중요하지 않은 매개 변수에 디폴트 인자를 지정할 수 있기 때문입니다.

void foo(int important, int common = 1, int trivial = 0);

예를 들어 이렇게 정의하면 foo() 함수 호출 시 important 인자외에 다른 것들은 기본 값을 그대로 사용할 수 있어 호출 구문이 간단해 집니다.

반면 하스켈에서는 커리 함수의 특성 상 중요한 매개 변수를 뒤에 배치하면 위와 비슷한 효과를 줄 수 있습니다.

foo trivial common important = ...

이렇게 정의하면 trivial 이나 common 매개 변수값을 고정값으로 하는 다른 함수를 쉽게 만들 수 있습니다.

fooTrivialZero = foo 0    -- void foo(int important, int common, int trivial = 0); 과 같음
fooCommonOne = fooTrivialZero 1    -- void foo(int important, int common = 1, int trivial = 0); 과 같음

물론 하스켈의 커리 함수는 해당 함수를 계속 재사용하여 다양한 디폴트 인자값을 갖는 함수를 정의할 수 있으므로 C/C++의 디폴트 인자 정의 함수의 편의성이 갖는 장점에 더하여 높은 재사용성까지 갖습니다.

첨언하자면 C/C++에서는 반드시 뒤에 있는 매개 변수부터 차례로 디폴트 인자를 지정해야 하지만 하스켈에서는 보다 유연한 방법을 제공합니다. 만약 두 개의 매개 변수를 받아야 하는 함수가 있는데 이 중 두 번째 인자를 고정값으로 하고 싶다면 해당 함수를 중위 연산 함수로 재정의하면 됩니다. 예를 들어,

sub a b = a - b

와 같은 함수가 있다면 어떤 수를 받아 항상 1을 빼주는 dec 라는 함수를 아래와 같이 정의할 수 있습니다.

dec = `sub` 1

sub 함수는 원래 전위 연산 함수지만 `sub`라고 하면 중위 연산 함수가 되어 아래와 같이 동작합니다.

dec 5 = 5 `sub` 1 = sub 5 1 = 5 - 1 = 4

만약 셋 이상의 인자를 받는 경우에 두번째 혹은 그 이상에 있는 인자에 디폴트 값을 주고 싶다면?
이 때는 람다 함수를 이용합니다. 예를 들어 위에서 정의한 foo 함수에서 세번째 인자에 디폴트 인자를 주고 싶으면 아래와 같이 정의합니다.

foo2 = (\x y -> foo x y 2)

이제 foo2 함수는 foo 함수에서 important 가 항상 2이고 common과 trivial 매개 인자만을 받는 함수입니다.

덧글

  • skippette 2007/04/29 14:42 # 답글

    와아, 프로그래밍 하시는 분들은 정말 멋져요. 자기만의 세상을 만들 수 있달까. 아무리 IT산업이 발달한다고 해도 만인이 프로그래밍을 하는 세계는 오지 않겠죠... 물론 간단한 프로그래밍을 도와주는 툴들이 나오기는 하겠지만요. :-)

    네, 전 곤충학도지만 사실 처음 목적은 인공지능의 가장 기본 토대를 만들고 싶어서;; 곤충 행동학, 심리학, 프로그래밍 세마리 토끼를 잡으려다 한마리 꽁지만 부여잡고 있는 중이랍니다. 그래도 나중에 나이 들어서 은퇴하면 (아직 대학다니면서 무슨;;) 열심히 프로그래밍을 배워서 손주들에게 게임을 만들어 주고 싶다는 작은 소망이 있어요 :-)

    가능하다면 곤충 인공지능을 완성할 수 있는 실력을 갖출 수 있었으면 좋겠어요. 공부해야죠, 공부!
  • silverbird 2007/04/29 23:13 # 답글

    // skippette
    자기만의 세상을 만들 수 있달까
    -> 자기만의 세상에 빠져 대인 관계에 소홀해지는 면은 좀 있죠...ㅡ_ㅡ

    아무리 IT산업이 발달한다고 해도 만인이 프로그래밍을 하는 세계는 오지 않겠죠...
    -> 예! 그래야 제가 먹고 살 수 있습니다...ㅡㅡ+++

    열심히 프로그래밍을 배워서 손주들에게 게임을 만들어 주고 싶다는 작은 소망이 있어요
    -> 정말 멋진 할머니가 되시겠군요...^^

    가능하다면 곤충 인공지능을 완성할 수 있는 실력을 갖출 수 있었으면 좋겠어요
    -> 혹시 skippette님의 최종 목표는 인공지능 곤충 로봇을 이용한 세계 정복?
  • skippette 2007/04/30 08:30 # 답글

    어렸을적 꿈이 세계정복이긴 했으나 이젠 접은 꿈이랍니다. 정복해도 할게 없어요;;;
  • silverbird 2007/05/01 20:31 # 답글

    아...세계 정복을 해도 할게 없다니...제가 skippette님을 너무 과소평가했군요. 죄송합니다...^^
댓글 입력 영역