SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
자원관리체계개발팀 병장 금기현
함슬람이 되는 길
모나드에 대해 알아보자
0. 모나드를 설명한다고?
• 잘 이해하도록 설명할 자신이 없음
0. 모나드를 설명한다고?
• 잘 이해하도록 설명할 자신이 없음
• 에초에 ‘이미 충분히 모나드를 설명하는 좋은 글이 많으니, 더이상 모다드에 대한 글을 쓰
지 마라’ 란 말이 있음
0. 모나드를 설명한다고?
• 잘 이해하도록 설명할 자신이 없음
• 에초에 ‘이미 충분히 모나드를 설명하는 좋은 글이 많으니, 더이상 모다드에 대한 글을 쓰
지 마라’ 란 말이 있음
• 그럼에도 너무 좋은 모나드 설명 영상을 찾아버려서 같이 공유하고 싶었음
0. 모나드를 설명한다고?
https://youtube.com/channel/
UCrlZnbV0o2cnUNWdEORTxsw
유튜브에 ‘이읗’ 검색
0. 모나드를 설명한다고?
• 수학적인 모나드를 다루진 않겠음. 나도 사실 잘 모름
• 프로그래밍 관점에서 모나드를 어떻게 사용하는지에 초점을 맞춰서 설명하려 함
0-1. 사전지식
수학에서 함수를 합성한다는 것
f : X -> Y
g : Y -> Z
가 있으면
X -> Z 를 만들 수 있음
g*f
0-1. 사전지식
프로그래밍에서 함수를 합성한다는 것
파일에서 한줄을 읽어서 문자열로 반
환하는 함수 readLine
fi
le -> string
문자열을 띄어쓰기를 기준으로 나누어
리스트로 반환하는 함수 split
string -> list<string>
readLine의 리턴 타입과 split의 인자 타입이 같기 때문에 둘을 합성할 수 있음
파일에서 한 줄을 읽어 띄어쓰기 단위로 문자열을 나누는 함수
split*readLine :
fi
le -> list<string>
+
0-1. 사전지식
프로그래밍에서 함수를 합성한다는 것
이런식으로 짜면 간지가 남
1. 함수형 프로그래밍?
클로져? 고차함수? 순수함수? 모나드?
• 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약
형, map
fi
lter reduce 연산 등이 당연하게 받아들여짐
1. 함수형 프로그래밍?
클로져? 고차함수? 순수함수? 모나드?
• 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약
형, map
fi
lter reduce 연산 등이 당연하게 받아들여짐
• 그런데 FP가 뭔지 말하라고 하면 딱히 떠오르는 단어가 없음
1. 함수형 프로그래밍?
클로져? 고차함수? 순수함수? 모나드?
• 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약
형, map
fi
lter reduce 연산 등이 당연하게 받아들여짐
• 그런데 FP가 뭔지 말하라고 하면 딱히 떠오르는 단어가 없음
• 그래서 FP의 한 축을 담당하는 모나드와 함수의 합성을 예시와 함께 풀어나가보려 함
1. 함수형 프로그래밍
예시
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
“bearer [id] [pw]”
인증 토큰
ID User
1 KeeHyun
2 ChimChakMan
DB
{
“id” : 2
“name” : “ChimChakMan”
“pw” : “미까따1!”
}
사용자 정보 User
1. 함수형 프로그래밍
구현에 필요한 기능들
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
2. 추출한 ID로 DB에서 사용자 정보 검색
3. PW 검증 후 인증 객체 반환
1. 함수형 프로그래밍
각 기능을 함수로 표현
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> ID
• func extarctPW : Token -> PW
2. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> User
3. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Auth
이런 함수들을 합성해서
대충 Token을 주면 Auth를 반환하는
함수를 만들어야 함
Token -> Auth
auth := verityPW(
fi
ndUser(extractID(token)),
extractPW(token)
)
1. 함수형 프로그래밍
함수 안에 부작용이 있음
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> ID (유효하지 않은 토큰 형식으로, 인증 토큰에서 ID를 추출하지 못할 수도 있음)
• func extarctPW : Token -> PW (유효하지 않은 토큰 형식으로, 인증 토큰에서 PW를 추출하지 못할 수도 있음)
2. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> User (DB에 ID에 해당하는 사용자 정보가 없을 수도 있음)
3. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Auth (PW가 틀려서 인증 객체를 생성하지 못할 수도 있음)
1. 함수형 프로그래밍
부작용을 관리하면서 순수 함수들을 합성?
구현하는 함수는 순수 함수로 작성해야 함
=> 함수 내에 부작용이 있으면 안됨
(ex: throw exception)
어떤 타입 T에 대해서
T 값이 있거나 없거나를 나타내는
M<T>가 필요함
1. 함수형 프로그래밍
부작용을 관리하면서 순수 함수들을 합성?
구현하는 함수는 순수 함수로 작성해야 함
=> 함수 내에 부작용이 있으면 안됨
(ex: throw exception)
어떤 타입 T에 대해서
T 값이 있거나 없거나를 나타내는
M<T>가 필요함
Optional<T>
1. 함수형 프로그래밍
리턴 타입을 모두 Optional로 변경
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> Optional<ID>
• func extarctPW : Token -> Optional<PW>
2. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> Optional<User>
3. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Optional<Auth>
1. 함수형 프로그래밍
함수 작성
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> Optional<ID>
• func extarctPW : Token -> Optional<PW>
1. 함수형 프로그래밍
함수 작성
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> Optional<User>
1. 함수형 프로그래밍
함수 작성
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Optional<Auth>
1. 함수형 프로그래밍
작성한 순수 함수들을 합성?
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> Optional<ID>
• func extarctPW : Token -> Optional<PW>
2. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> Optional<User>
3. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Optional<Auth>
근데
extractID : Token -> Optional<ID>
fi
ndUser : ID -> Optional<User>
를 합성시킬 수 없게됨
fi
ndUser*extractID : Token -> Optional<User>
함수를 만들 수 있어야 함
1. 함수형 프로그래밍
Optional을 합성할 수 있어야 함
• 인증 토큰을 받아서 사용자 인증을 하는 프로그램
1. 인증 토큰에서 ID, PW 추출
• func extractID : Token -> Optional<ID>
• func extarctPW : Token -> Optional<PW>
2. 추출한 ID로 DB에서 사용자 정보 검색
• func
fi
ndUser : ID -> Optional<User>
3. PW 검증 후 인증 객체 반환
• func verifyPW : (User, PW) -> Optional<Auth>
M<T>에 대해서 함수 합성을 용이하
게 하는 인터페이스를 제공해야 함
=> Optional<T>
or Maybe<T>
2. Functor
• functor : generic type(F<T>) + lift(or map)
• lift : (f: T -> U) -> (F<T> -> F<U>)
어떤 타입 T, U에 대해서
함수 f: T -> U 가 주어지면
함수 F<T> -> F<U> 를 반환하는 함수
2. Functor
Optional 구현
• lift : (f: T -> U) -> (Optional<T> -> Optional<U>)
• lift(f) : Optional<T> -> Optional<U>
• Optional<T> 에 T값이 없다면 U값이 비어있는 Optional<U> 반환
• Optional<T> 에 T값이 있다면 f(T)의 결과 U값을 담은 Optional<U> 반환
2. Functor
Optional 구현
lift는 함수를 받아 함수를 반환하는 함수
f: T -> U
Unit[U]: U -> Optional[U]
=>
Unit[U]*f: T -> Optional[U]
2. Functor
Optional 구현
Optional 때문에 합성을 할 수 없었던 문제
extractID : Token -> Optional<ID>
fi
ndUser : ID -> Optional<User>
를 합성시킬 수 없게됨
fi
ndUser*extractID : Token ->
Optional<User>
함수를 만들 수 있어야 함
fi
ndUser를 lift 시키고 extractID와 합성하면?
lift(
fi
ndUser) : Optional<ID> ->
Optional<Optional<User>>
lift(
fi
ndUser)*extractID : Token ->
Optional<Optional<User>>
합성할 수는 있지만 Optional이 두번 적용되어
있어 사용하기 힘듦
lift를 해도 Optional이 한번만 적용되어있을 순 없을까??
해서 필요한 것이 Monad
3. Monad
• monad : functor + unit +
fl
at
• unit : T -> M<T>
어떤 타입 T에 대해서
T를 M<T>로 변환하는 함수
•
fl
at : M<M<T>> -> M<T>
어떤 타입 T에 대해서
M<M<T>>를 M<T>로 변환하는 함수
타입 T에 대해서 어떠한 개념을
적용시키는 함수
어떠한 개념이 두번 적용된 것을
한 겹 벗기는 함수
3. Monad
당연히 맘대로 작성하면 안됨!
다음과 같은 성질을 만족해야 함
3. Monad
Optional 구현
• unit : T -> Optional<T>
• T가 nil이라면 값이 비어있는 Optional<T> 반환
• T가 nil이 아니라면 T값을 담은 Optional<T> 반환
3. Monad
Optional 구현
•
fl
at : Optional<Optional<T>> -> Optional<T>
• Optional<Optional<T>> 가 비어있다면 비어있는 Optional<T> 반환
• Optional<Optional<T>> 가 비어있지 않다면 그대로 Optional<T> 반환
3. Monad
fl
at의 활용
Optional이 2번 적용되어 사용하기 힘들었던 문제
lift(
fi
ndUser)*extractID : Token -> Optional<Optional<User>>
Optional이 2번 적용된 결과에
fl
at을 적용
lift(
fi
ndUser)*extractID : Token -> Optional<Optional<User>>
fl
at : Optional<Optional<User>> -> Optional<User>
fl
at*lift(
fi
ndUser)*extractID : Token -> Optional<User>
=>
fl
atlift(or
fl
atMap)
3. Monad
fl
atlift
fl
atlift를 통해
fi
ndUser와 extractID를 합성할 수 있게됨!
fl
at*lift(
fi
ndUser)*extractID : Token -> Optional<User>
or
fl
atlift(
fi
ndUser)*extractID : Token -> Optional<User>
3. Monad
인자가 2개인 함수는 어떻게 lift?
이제 인증 토큰을 인증 객체로 바꾸는 함수를 만드는데 남은 것
fl
atlift(
fi
ndUser)*extractID : Token -> Optional<User>
extractPW : Token -> Optional<PW>
+
verifyPW : (User, PW) -> Optional<Auth>
어떤 타입 T, U, V 에 대해서
f: (T, U) -> Optional<V> 가 주어지면
(Optional<T>, Optional<U>) -> Optional<V>를 반환하는 함수
3. Monad
2차원
fl
atlift
lift,
fl
atlift가 중요한 이유 중 하나는 다음과 같이 차원 확장이 가능하다는 것임
적분방정식과 같은 방법으로
U에 대해서 먼저
fl
atlift를 적용하고
그다음 T에 대해서
fl
atlift를 적용하는 함수임
3. Monad
모든 함수를 합성
인자가 2개인 함수를
fl
atlift 하는 문제
verifyPW : (User, PW) -> Optional<Auth>
fl
atlift_2D(verifyPW) : (Optional<User>, Optional<PW>) -> Optional<Auth>
auth := verityPW(
fi
ndUser(extractID(token)),
extractPW(token)
)
auth :=
fl
atlift_2D(verifyPW)(
fl
atlift(
fi
ndUser)(token),
extractPW(token)
)
3. Monad
결과
3. Monad
결과
사용자 정보를 찾을 수 없을 때 비밀번호 틀렸을 때
인증 토큰 형식이 틀렸을 때
3. Monad
Optional Monad
감사합니다

Weitere ähnliche Inhalte

Ähnlich wie 전산한마당 모나드.pdf

Naver Campus Hackday Winter 2017 참가 후기
Naver Campus Hackday Winter 2017 참가 후기Naver Campus Hackday Winter 2017 참가 후기
Naver Campus Hackday Winter 2017 참가 후기Youngbin Han
 
[OpenTRS-001] election_coin
[OpenTRS-001] election_coin[OpenTRS-001] election_coin
[OpenTRS-001] election_coinTheori
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptInjae Lee
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글라한사 아
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8문익 장
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong Chan Shin
 
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
I os push:  세상에서 가장 간단한  날씨, 대기환경 엡I os push:  세상에서 가장 간단한  날씨, 대기환경 엡
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡HannaSungKim
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummarySeungYeonChoi10
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)문익 장
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4성연 김
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 pptInjae Lee
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL studySeo Dong-yu
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee
 

Ähnlich wie 전산한마당 모나드.pdf (20)

Naver Campus Hackday Winter 2017 참가 후기
Naver Campus Hackday Winter 2017 참가 후기Naver Campus Hackday Winter 2017 참가 후기
Naver Campus Hackday Winter 2017 참가 후기
 
[OpenTRS-001] election_coin
[OpenTRS-001] election_coin[OpenTRS-001] election_coin
[OpenTRS-001] election_coin
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
Boost
BoostBoost
Boost
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
I os push:  세상에서 가장 간단한  날씨, 대기환경 엡I os push:  세상에서 가장 간단한  날씨, 대기환경 엡
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 Summary
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL study
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 

전산한마당 모나드.pdf

  • 1. 자원관리체계개발팀 병장 금기현 함슬람이 되는 길 모나드에 대해 알아보자
  • 2. 0. 모나드를 설명한다고? • 잘 이해하도록 설명할 자신이 없음
  • 3. 0. 모나드를 설명한다고? • 잘 이해하도록 설명할 자신이 없음 • 에초에 ‘이미 충분히 모나드를 설명하는 좋은 글이 많으니, 더이상 모다드에 대한 글을 쓰 지 마라’ 란 말이 있음
  • 4. 0. 모나드를 설명한다고? • 잘 이해하도록 설명할 자신이 없음 • 에초에 ‘이미 충분히 모나드를 설명하는 좋은 글이 많으니, 더이상 모다드에 대한 글을 쓰 지 마라’ 란 말이 있음 • 그럼에도 너무 좋은 모나드 설명 영상을 찾아버려서 같이 공유하고 싶었음
  • 6. 0. 모나드를 설명한다고? • 수학적인 모나드를 다루진 않겠음. 나도 사실 잘 모름 • 프로그래밍 관점에서 모나드를 어떻게 사용하는지에 초점을 맞춰서 설명하려 함
  • 7. 0-1. 사전지식 수학에서 함수를 합성한다는 것 f : X -> Y g : Y -> Z 가 있으면 X -> Z 를 만들 수 있음 g*f
  • 8. 0-1. 사전지식 프로그래밍에서 함수를 합성한다는 것 파일에서 한줄을 읽어서 문자열로 반 환하는 함수 readLine fi le -> string 문자열을 띄어쓰기를 기준으로 나누어 리스트로 반환하는 함수 split string -> list<string> readLine의 리턴 타입과 split의 인자 타입이 같기 때문에 둘을 합성할 수 있음 파일에서 한 줄을 읽어 띄어쓰기 단위로 문자열을 나누는 함수 split*readLine : fi le -> list<string> +
  • 9. 0-1. 사전지식 프로그래밍에서 함수를 합성한다는 것 이런식으로 짜면 간지가 남
  • 10. 1. 함수형 프로그래밍? 클로져? 고차함수? 순수함수? 모나드? • 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약 형, map fi lter reduce 연산 등이 당연하게 받아들여짐
  • 11. 1. 함수형 프로그래밍? 클로져? 고차함수? 순수함수? 모나드? • 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약 형, map fi lter reduce 연산 등이 당연하게 받아들여짐 • 그런데 FP가 뭔지 말하라고 하면 딱히 떠오르는 단어가 없음
  • 12. 1. 함수형 프로그래밍? 클로져? 고차함수? 순수함수? 모나드? • 몇년 전만해도 함수형 프로그래밍이란 단어가 어색했는데 이제는 함수 리터럴, 함수 축약 형, map fi lter reduce 연산 등이 당연하게 받아들여짐 • 그런데 FP가 뭔지 말하라고 하면 딱히 떠오르는 단어가 없음 • 그래서 FP의 한 축을 담당하는 모나드와 함수의 합성을 예시와 함께 풀어나가보려 함
  • 13. 1. 함수형 프로그래밍 예시 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 “bearer [id] [pw]” 인증 토큰 ID User 1 KeeHyun 2 ChimChakMan DB { “id” : 2 “name” : “ChimChakMan” “pw” : “미까따1!” } 사용자 정보 User
  • 14. 1. 함수형 프로그래밍 구현에 필요한 기능들 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 2. 추출한 ID로 DB에서 사용자 정보 검색 3. PW 검증 후 인증 객체 반환
  • 15. 1. 함수형 프로그래밍 각 기능을 함수로 표현 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> ID • func extarctPW : Token -> PW 2. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> User 3. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Auth 이런 함수들을 합성해서 대충 Token을 주면 Auth를 반환하는 함수를 만들어야 함 Token -> Auth auth := verityPW( fi ndUser(extractID(token)), extractPW(token) )
  • 16. 1. 함수형 프로그래밍 함수 안에 부작용이 있음 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> ID (유효하지 않은 토큰 형식으로, 인증 토큰에서 ID를 추출하지 못할 수도 있음) • func extarctPW : Token -> PW (유효하지 않은 토큰 형식으로, 인증 토큰에서 PW를 추출하지 못할 수도 있음) 2. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> User (DB에 ID에 해당하는 사용자 정보가 없을 수도 있음) 3. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Auth (PW가 틀려서 인증 객체를 생성하지 못할 수도 있음)
  • 17. 1. 함수형 프로그래밍 부작용을 관리하면서 순수 함수들을 합성? 구현하는 함수는 순수 함수로 작성해야 함 => 함수 내에 부작용이 있으면 안됨 (ex: throw exception) 어떤 타입 T에 대해서 T 값이 있거나 없거나를 나타내는 M<T>가 필요함
  • 18. 1. 함수형 프로그래밍 부작용을 관리하면서 순수 함수들을 합성? 구현하는 함수는 순수 함수로 작성해야 함 => 함수 내에 부작용이 있으면 안됨 (ex: throw exception) 어떤 타입 T에 대해서 T 값이 있거나 없거나를 나타내는 M<T>가 필요함 Optional<T>
  • 19. 1. 함수형 프로그래밍 리턴 타입을 모두 Optional로 변경 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> Optional<ID> • func extarctPW : Token -> Optional<PW> 2. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> Optional<User> 3. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Optional<Auth>
  • 20. 1. 함수형 프로그래밍 함수 작성 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> Optional<ID> • func extarctPW : Token -> Optional<PW>
  • 21. 1. 함수형 프로그래밍 함수 작성 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> Optional<User>
  • 22. 1. 함수형 프로그래밍 함수 작성 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Optional<Auth>
  • 23. 1. 함수형 프로그래밍 작성한 순수 함수들을 합성? • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> Optional<ID> • func extarctPW : Token -> Optional<PW> 2. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> Optional<User> 3. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Optional<Auth> 근데 extractID : Token -> Optional<ID> fi ndUser : ID -> Optional<User> 를 합성시킬 수 없게됨 fi ndUser*extractID : Token -> Optional<User> 함수를 만들 수 있어야 함
  • 24. 1. 함수형 프로그래밍 Optional을 합성할 수 있어야 함 • 인증 토큰을 받아서 사용자 인증을 하는 프로그램 1. 인증 토큰에서 ID, PW 추출 • func extractID : Token -> Optional<ID> • func extarctPW : Token -> Optional<PW> 2. 추출한 ID로 DB에서 사용자 정보 검색 • func fi ndUser : ID -> Optional<User> 3. PW 검증 후 인증 객체 반환 • func verifyPW : (User, PW) -> Optional<Auth> M<T>에 대해서 함수 합성을 용이하 게 하는 인터페이스를 제공해야 함 => Optional<T> or Maybe<T>
  • 25. 2. Functor • functor : generic type(F<T>) + lift(or map) • lift : (f: T -> U) -> (F<T> -> F<U>) 어떤 타입 T, U에 대해서 함수 f: T -> U 가 주어지면 함수 F<T> -> F<U> 를 반환하는 함수
  • 26. 2. Functor Optional 구현 • lift : (f: T -> U) -> (Optional<T> -> Optional<U>) • lift(f) : Optional<T> -> Optional<U> • Optional<T> 에 T값이 없다면 U값이 비어있는 Optional<U> 반환 • Optional<T> 에 T값이 있다면 f(T)의 결과 U값을 담은 Optional<U> 반환
  • 27. 2. Functor Optional 구현 lift는 함수를 받아 함수를 반환하는 함수 f: T -> U Unit[U]: U -> Optional[U] => Unit[U]*f: T -> Optional[U]
  • 28. 2. Functor Optional 구현 Optional 때문에 합성을 할 수 없었던 문제 extractID : Token -> Optional<ID> fi ndUser : ID -> Optional<User> 를 합성시킬 수 없게됨 fi ndUser*extractID : Token -> Optional<User> 함수를 만들 수 있어야 함 fi ndUser를 lift 시키고 extractID와 합성하면? lift( fi ndUser) : Optional<ID> -> Optional<Optional<User>> lift( fi ndUser)*extractID : Token -> Optional<Optional<User>> 합성할 수는 있지만 Optional이 두번 적용되어 있어 사용하기 힘듦 lift를 해도 Optional이 한번만 적용되어있을 순 없을까?? 해서 필요한 것이 Monad
  • 29. 3. Monad • monad : functor + unit + fl at • unit : T -> M<T> 어떤 타입 T에 대해서 T를 M<T>로 변환하는 함수 • fl at : M<M<T>> -> M<T> 어떤 타입 T에 대해서 M<M<T>>를 M<T>로 변환하는 함수 타입 T에 대해서 어떠한 개념을 적용시키는 함수 어떠한 개념이 두번 적용된 것을 한 겹 벗기는 함수
  • 30. 3. Monad 당연히 맘대로 작성하면 안됨! 다음과 같은 성질을 만족해야 함
  • 31. 3. Monad Optional 구현 • unit : T -> Optional<T> • T가 nil이라면 값이 비어있는 Optional<T> 반환 • T가 nil이 아니라면 T값을 담은 Optional<T> 반환
  • 32. 3. Monad Optional 구현 • fl at : Optional<Optional<T>> -> Optional<T> • Optional<Optional<T>> 가 비어있다면 비어있는 Optional<T> 반환 • Optional<Optional<T>> 가 비어있지 않다면 그대로 Optional<T> 반환
  • 33. 3. Monad fl at의 활용 Optional이 2번 적용되어 사용하기 힘들었던 문제 lift( fi ndUser)*extractID : Token -> Optional<Optional<User>> Optional이 2번 적용된 결과에 fl at을 적용 lift( fi ndUser)*extractID : Token -> Optional<Optional<User>> fl at : Optional<Optional<User>> -> Optional<User> fl at*lift( fi ndUser)*extractID : Token -> Optional<User> => fl atlift(or fl atMap)
  • 34. 3. Monad fl atlift fl atlift를 통해 fi ndUser와 extractID를 합성할 수 있게됨! fl at*lift( fi ndUser)*extractID : Token -> Optional<User> or fl atlift( fi ndUser)*extractID : Token -> Optional<User>
  • 35. 3. Monad 인자가 2개인 함수는 어떻게 lift? 이제 인증 토큰을 인증 객체로 바꾸는 함수를 만드는데 남은 것 fl atlift( fi ndUser)*extractID : Token -> Optional<User> extractPW : Token -> Optional<PW> + verifyPW : (User, PW) -> Optional<Auth> 어떤 타입 T, U, V 에 대해서 f: (T, U) -> Optional<V> 가 주어지면 (Optional<T>, Optional<U>) -> Optional<V>를 반환하는 함수
  • 36. 3. Monad 2차원 fl atlift lift, fl atlift가 중요한 이유 중 하나는 다음과 같이 차원 확장이 가능하다는 것임 적분방정식과 같은 방법으로 U에 대해서 먼저 fl atlift를 적용하고 그다음 T에 대해서 fl atlift를 적용하는 함수임
  • 37. 3. Monad 모든 함수를 합성 인자가 2개인 함수를 fl atlift 하는 문제 verifyPW : (User, PW) -> Optional<Auth> fl atlift_2D(verifyPW) : (Optional<User>, Optional<PW>) -> Optional<Auth> auth := verityPW( fi ndUser(extractID(token)), extractPW(token) ) auth := fl atlift_2D(verifyPW)( fl atlift( fi ndUser)(token), extractPW(token) )
  • 39. 3. Monad 결과 사용자 정보를 찾을 수 없을 때 비밀번호 틀렸을 때 인증 토큰 형식이 틀렸을 때