프로그래밍 검색 블로그

함수형 패턴 매칭 본문

함수형 프로그래밍

함수형 패턴 매칭

코딩조무사 2017. 10. 10. 07:00

프로그래밍 언어에서 함수를 호출할때 

절차/객체지향 계열의 프로그래밍 언어는 주로 오버로딩을 통해서 기능들을 관리했지만 

함수형 언어 에서는 패턴 매칭을 통해서 기능을 관리했다


C에서 보자면 if문을 함수 호출에 사용하는 꼴


1
2
my_max (x:y:[]) = if x < y then y else x
my_max (x:xs) = my_max [x,(my_max xs)]
cs


간단하게 하스켈로 작성한 my_max 함수이다 

기능은 리스트에 원소가 둘이라면 if-else로 비교 

그이상이면 재귀로 호출하게 한다.



이것을 비슷한 코드를 C++로 옮기면 다음과 같다. 


1
2
3
4
5
6
7
8
9
10
11
12
int my_max(int a, int b){
    return a < b ? b : a;
}
int my_max(std::vector<int> a){
    auto length = a.size();
    if(length == 2return my_max(a[0],a[1]);
    else if(length > 2) {
        auto fst = a[0];
        return my_max(fst, my_max({a.begin() + 1, a.end()}));
    }
    else throw std::invalid_argument("length == 0 or 1");
}
cs

max를 실제로 사용한다면 반복문으로 돌리겠지만 단순히 max가 아니라

실제로 많이 사용하는 객체의 값의 비교 (A 라는 객체가 null일때, null이 아닐때, 특정값이 1일때 등)를 생각하면

이런 부분에서는 함수형이 더 나아보인다. 


최신 언어에서는 when등을 넣어서 패턴매칭을 넣기도 한다

아래는 코틀린 


1
2
3
4
5
6
7
8
9
10
11
fun my_max(a : Int, b : Int): Int = if(a < b) b else a
fun my_max(x : ArrayList<Int>): Int {
    return when(x.size){
        01 -> throw  IllegalArgumentException("length == 0 or 1")
        2 -> my_max(x[0],x[1])
        else -> {
            val popValue = x.removeAt(0)
            my_max(popValue, my_max(x))
        }
    }
}
cs


Comments