Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Reflect
- SHA512
- Functional
- web
- program
- SHA1
- sha256
- kotlin
- template
- ranges
- Observer
- sprintf
- AES
- async
- Scala
- ChromeTab
- RAII
- go
- CustomTab
- coroutines
- type_traits
- haskell
- c++
- traits
- stringprintf
- design pattern
- Android
- WebView
- Clojure
- Chrono
Archives
- Today
- Total
프로그래밍 검색 블로그
함수형 패턴 매칭 본문
프로그래밍 언어에서 함수를 호출할때
절차/객체지향 계열의 프로그래밍 언어는 주로 오버로딩을 통해서 기능들을 관리했지만
함수형 언어 에서는 패턴 매칭을 통해서 기능을 관리했다
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 == 2) return 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){ 0, 1 -> 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