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 | 29 | 30 |
Tags
- web
- template
- RAII
- haskell
- WebView
- sha256
- ChromeTab
- stringprintf
- Android
- coroutines
- Clojure
- Observer
- AES
- Scala
- SHA1
- go
- type_traits
- kotlin
- SHA512
- Chrono
- Functional
- async
- c++
- design pattern
- ranges
- program
- CustomTab
- traits
- sprintf
- Reflect
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 |