함수형 프로그래밍
쿠재아이
김재경
왜 이런 주제를?
390회에서 발표한 Reactive Programming
스터디 前
• 오늘은 어떤 내용일까 기대
• 처음이자 마지막으로 예습도 함
스터디 後
• 예상과는 달리 난해한 내용
• 설명을 들어도 이해가 안 됨
• 뭔가 새롭다는 건 알겠는데…
?????
스터디 後
• 발표는 Reactive가 중심
• 하지만 Functinal이 더 끌렸음
• 한 번 알아보고 싶다고 생각
스터디 後
이 PPT도 호기심을 자극했었음
2017 NDC
올해 NDC에서도 등장
근데 왜 이 주제를?
이 2개는 Reactive에 초점을 맞춰서 Functional 설명은 좀…
※ 개인적인 생각입니다
근데 왜 이 주제를?
상당히 만족스러운데 뭔가 2% 부족한 느낌
※ 개인적인 생각입니다
함수형 프로그래밍
쿠재아이
김재경
이제 뭔지 알아봅시다
Think
객체 지향 프로그래밍
Think
객체 지향 프로그래밍에서
처음에 무엇이 제일 궁금했나요?
Think
객체지향 프로그래밍에서
처음에 무엇이 제일 궁금했나요?
Think
그럼 함수형 프로그래밍은?
Think
그럼 함수형 프로그래밍은?
함수
function
함수?
• 내가 알고 있는 함수와 다른가?
• 다르면 어떤 점이?
• ‘함수’형 프로그래밍이라 할만큼 중요한가?
1. First-class function
• 함수를 변수에 저장할 수 있음
• 함수를 인자로 넘기거나 리턴이 가능 함
• 이후 소개할 특징의 기본이 되는 개념
2. Higher-order function
• 고차함수 or 고계함수로 번역
• 하나 이상의 함수를 인자로 받거나
• 함수를 리턴하는 함수
• 고차함수를 이용하여 데이터를 처리
2. Higher-order function
2. Higher-order function
String을 Integer로 바꾸고
2. Higher-order function
짝수만 골라낸 뒤
2. Higher-order function
합을 리턴
3. Anonymous function
• C++11에서는 람다 표현식이라 부름
• 인자로 전달되는 함수나
• 리턴되는 함수로 사용
3. Anonymous function
람다가 없으면 함수를 인자로 넘기기 위해 따로 만들어야 함
3. Anonymous function
람다를 사용하면 따로 함수를 만들 필요 없음
함수형 프로그래밍에서 람다가 없으면 매우 끔찍 할 듯
4. Nested function
• 중첩 함수
• 함수 안에 다른 함수가 정의된 함수
4. Nested function
출력 값은?
4. Nested function
4. Nested function
4. Nested function
그런데 말입니다
4. Nested function
어떻게 외부 함수의 변수에 접근할 수 있지?
5. Closure
• 내부에서 참조되는 모든 인수에 대한 묵시적 바인딩을
지닌 함수를 말함
• 자신이 참조하는 문맥(context)를 포함한다
• C++11에서는 람다 표현식으로 생성
• 다만 람다 밖의 변수는 Capture를 통해 접근
• 이해가 잘 안되면 Functor를 생각하면 됨
5. Closure
클로저 객체가 생성되고 바로 실행
5. Closure
• C++에서는 왜 Capture를 통해서 외부 변수에
접근하도록 했을까?
6. Pure function
• 함수의 결과값이 오직 입력 인자 값들에 의해서만 결정
• Side effects가 없음
int abs(int n);
int atoi(const char *str);
int getDefaultPort(bool https) {
return https ? 443 : 80;
}
int rand();
time_t time (time_t* timer);
bool g_https = false;
int getDefaultPort() {
return g_https ? 443 : 80;
}
6. Pure function
• 참조 투명성을 가짐
- 어떤 표현식을 그 표현식의 결과값으로 교체해도
전체 프로그램의 실행결과에 영향을 주지 않는 성질
• 컴파일러에게 다양한 최적화 기회를 제공
- Memoization
- Lazy evaluation
불변성
Immutability
불변성
• 내용의 변경은 새로운 객체를 생성할 때만 가능
• 생성, 테스트, 사용법이 단순하고 쉬움
• Thread-Safe
• 쉬운 캐쉬 – 이름이 같으면 내용도 같음
• Temporal coupling 줄임
• Identity mutability problem 없음
Temporal coupling
HttpRequest request;
request.SetUrl("https://hostname/api");
request.SetSSL(true);
request.SetCACert("ca-bundle.crt");
request.Post();
HttpRequest request;
request.SetUrl("https://hostname/api");
request.SetSSL(true);
request.Post(); // Error!
Temporal coupling
class HttpRequest {
public:
HttpRequest(const std::string& url, bool ssl,
const std::string& cacert);
// no setters
...
};
HttpRequest request("https://hostname/api", true,
"ca-bundle.crt");
request.Post();
Identity mutability problem
using MonsterPtr = std::shared_ptr<Monster>;
std::map<int64_t, MonsterPtr> monsters;
MonsterPtr p1 = std::make_shared<Monster>(1234, “Murloc");
monsters.insert(std::make_pair(p1.id(), p1));
p1->setID(2234); // ???
불변성
잠깐
불변성
• 객체를 변경하려면 새로 생성해야 된다고?
• 너무 비효율적인거 같은데…
• 캐릭터가 이동할 때마다 새로 생성해야 되는거 실화?
• 기본 자료구조는 어떻게 구현?
• 성능 이슈는?
이건 물론 가변성으로 만들겠죠
영속성 자료 구조
Persistent data structure
영속성 자료 구조
• 수정될 때 항상 이전 버전의 데이터를 보존하는 자료 구조
• 리스트 2개가 있다고 가정
• xs = [0, 1, 2]
ys = [3, 4, 5]
• zs = xs + ys 는?
영속성 자료 구조
• 완전히 새로 생성하지 않고
기존의 구조를 이용하여 생성
영속성 자료 구조
• 트리
• xs = [a, b, c, d, e, f, g, h]
• ys = insert(“e”, xs)는?
영속성 자료 구조
메모이제이션
Memoization
메모이제이션
• 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에
저장함으로써 동일한 계산의 반복 수행을 제거하여
프로그램 실행 속도를 빠르게 하는 기술
• 동적 계획법의 핵심
메모이제이션
• 메모이제이션 X
• 중복되는 함수 호출
• 매우 비효율적
메모이제이션
미리 계산한 값을 사용하여 실행 속도가 빠름
메모이제이션
• 언어에서 기본으로 제공
• 함수의 리턴 값을 자동적으로 캐싱
게임에서 적용은?
게임에서 적용은?
• Thread-safe 하니까 가장 먼저 생각난 곳은 서버
이 발표에서 함수형 언어가 언급
게임에서 적용은?
게임에서 적용은?
출처
• Functional Reactive Programming With RxSwift
- https://www.slideshare.net/sunhyouplee/functional-reactive-programming-with-rxswift-62123571
• NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
- https://www.slideshare.net/jongwookkim/ndc14-rx-functional-reactive-programming
• 더 좋은 코드를 위한 함수형 프로그래밍
- https://www.slideshare.net/isaacjeon/ndc17-ppt-fpinmodernc
• 위키피디아 Functional programming
- https://en.wikipedia.org/wiki/Functional_programming
• 위키피디아 Persistent data structure
- https://en.wikipedia.org/wiki/Persistent_data_structure
• 클로저라는 훌륭한 도구와 영속 불변 자료 구조
- goo.gl/m6aAWN
• 값중심의 프로그래밍
- http://ropas.snu.ac.kr/~kwang/paper/maso/1.pdf
출처
• Nested function
- http://ajaxlab.net/?p=182
• 함수형 프로그래머가 되고 싶다고? (Part 1~6)
- goo.gl/CWyhjd
• 나무위키 메모이제이션
- https://namu.wiki/w/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98
• 함수형 사고
- http://www.hanbit.co.kr/store/books/look.php?p_code=B6064588422
Q / A

함수형 프로그래밍