ݺߣ

ݺߣShare a Scribd company logo
하스켈 모나드
하스켈 학교
2016년 4월 12일 서광열
하스켈 모나드
하스켈 모나드
하스켈 모나드
하스켈 모나드
하스켈 모나드
하스켈의 특징
● Pure function
● High order function
● Polymorphism
● Lazy evaluation
● Type class
● Monad
왜 하스켈은 이런 특징을 가지는가?
소프트웨어 공학적 접근
재사용(Reusability)
● 이미 만들어진 설계, 코드, 테스트, 문서 등을 재사용할 수 있어야 한다.
분할 정복(divide and conquer)
● 복잡한 문제는 작은 단위로 나눠서 풀고 재조합한다.
그래서 조합성(compositionality)이 중요!
프로그래밍의 본질
● 프로그래밍 본질은 조합(compositin)
● 바꿔 말해, 복잡한 문제를 분해(decomposition)하고 재조합(recomposition)
하는 일
○ Category: The Essence of Composition, https://bartoszmilewski.
com/2014/11/04/category-the-essence-of-composition/
함수 언어 = 조합 언어
함수 언어의 모든 기능은 조합을 쉽게 하기 위한 방법
● 다형성 + 고차 함수 = 재사용성
○ Higher-order + Polymorphic = Reusable, https://kar.kent.ac.
uk/21504/3/Higher-order_+_Polymorphic_=_Reusable.pdf
● 지연 연산 = 모듈성
○ Why Functional Programming Matters, https://www.cs.kent.ac.
uk/people/staff/dat/miranda/whyfp90.pdf
표기법
● 기본 타입: Int, Char, String
● 타입 변수: a, b, c
● 함수 타입: Int -> String, a -> b
● 함수: f, g, h
합수 합성
● f :: A -> B
● g :: B -> C
● g . f :: A -> C
법칙
● (f . g) . h = f . (g . h)
● f . id = f
● id . f = f
순수 함수의 합성
> (take 2 . filter (>=3) . map length) [“a”, “ab”, “abc”, “abcd”, “abcde”]
[3,4]
> map (negate . abs) [5, -3, -6, 7, -3, 2, -19, 24]
[-5,-3,-6,-7,-3,-2,-19,-24]
범주(Category)
class Category cat where
id :: cat a a
(.) :: cat b c -> cat a b -> cat a c
법칙
● (f . g) . h = f . (g . h)
● f . id = f
● id . f = f
instance Category (->) where
id x = x
(f . g) x = f (g x)
함수 합성
하지만 현실
은...
하스켈 모나드
함수 합성의 장애물
1. 오류
2. 비결정성
3. 콘텍스트
4. IO
5. ...
1. 오류
data Maybe a = Just a | Nothing
f :: A -> Maybe B
g :: B -> Maybe C
g . f :: ??
Maybe를 리턴하는 함수는 (.)로 조합이 불가능
오류 발생 가능한 함수의 조합
return :: (a -> Maybe a)
return = Just
(<=<) :: (b -> Maybe c) -> (a -> Maybe b) -> (a -> Maybe c)
(f <=< g) x =
case g x of
Just y -> f y
Nothing -> Nothing
함수 합성과의 비교
id :: (a -> a)
return :: (a -> Maybe a)
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(<=<) :: (b -> Maybe c) -> (a -> Maybe b) -> (a -> Maybe c)
(f . g) x = f (g x)
(f <=< g) x = f =<< (g x)
2. 비결정성
data List a = Cons a (List a) | Nil
f :: A -> [B]
g :: B -> [C]
g . f :: ??
리스트를 리턴하는 함수는 (.)로 조합이 불가능
비결정적 함수의 조합
return :: (a -> [a])
return a = [a]
(<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c])
(f <=< g) x = concatMap f (g x)
함수 합성과의 비교
id :: (a -> a )
return :: (a -> [a])
(.) :: (b -> c ) -> (a -> b ) -> (a -> c )
(<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c])
(f . g) x = f (g x)
(f <=< g) x = concatMap f (g x)
3. 콘텍스트
f :: A -> (R -> B)
g :: B -> (R -> C)
g . f :: ??
콘텍스트를 인자로 받는 함수는 (.)로 조합이 불가능
콘텍스트 함수의 조합
return :: a -> (r -> a)
return a = r -> a
(<=<) :: (b -> (r -> c)) -> ((a -> (r -> b)) -> (a -> (r -> c))
(f <=< g) x = r -> f ((g x) r) r
함수 합성과의 비교
id :: (a -> a)
return :: (a -> (r-> a))
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(<=<) :: (b -> (r -> c)) -> (a -> (r -> b)) -> (a -> (r -> c))
(f . g) x = f (g x)
(f <=< g) x = r -> f ((g x) r) r
4. IO
f :: A -> IO B
g :: B -> IO C
g . f :: ??
IO 함수는 (.)로 조합이 불가능
IO 함수의 조합
return :: (a -> IO a)
(<=<) :: (b -> IO c) -> (a -> IO b) -> (a -> IO c)
함수 합성과의 비교
id :: (a -> a)
return :: (a -> IO a)
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(<=<) :: (b -> IO c) -> (a -> IO b) -> (a -> IO c)
(f . g) x = f (g x)
(f <=< g) x = f =<< (g x)
함수 합성
지금까지의 공통점
은?
클라이슬리 범주(Kleisli Category)
return :: (Monad m) => (a -> m a)
(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)
newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
instance Monad m => Category (Kleisli m) where
id = Kleisli return
(Kleisli f) . (Kleisli g) = Kleisli (f <=< g)
모나드
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
● (a >>= f) = (f <=< id) a
● (f <=< g) x = f =<< (g x)
모나드 법칙
범주 법칙
● return <=< f = f
● f <=< return = f
● (f <=< g) <=< h = f <=< (g <=< h)
모나드 법칙
● m >>= return = m
● return x >>= f = f x
● m >>= (y -> g y >>= f) = (m >>= g) >>= f
모나드
조합성과 모나드
● 모나드는 부분 함수, 비결정적 함수, IO 함수 등에 조합성을 주기 위한 프로
그램의 구조라고 이해할 수 있음
모나드의 종류
● Maybe
● Either
● IO
● Reader
● Writer
● State
● Continuation
● Parser
● Pipe
모나드의 조합성
IO와 State가 동시에 필요하면?
● 모나드는 일반적인 조합이 불가능함
● 모나드 트랜스포머(Monad Transformer) 사용
정리
Functional Programming
=>
Compositional Programming
감사니다

More Related Content

What's hot (20)

Python Programming: Function
Python Programming: FunctionPython Programming: Function
Python Programming: Function
Chan Shik Lim
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
Nam Hyeonuk
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
Terry Cho
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
Nam Hyeonuk
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
Nam Hyeonuk
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조
영기 김
R 기본-데이타형 소개
R 기본-데이타형 소개R 기본-데이타형 소개
R 기본-데이타형 소개
Terry Cho
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
Nam Hyeonuk
R 스터디 네번째
R 스터디 네번째R 스터디 네번째
R 스터디 네번째
Jaeseok Park
R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작
Terry Cho
5. queue
5. queue5. queue
5. queue
Geunhyung Kim
4. stack
4. stack4. stack
4. stack
Geunhyung Kim
Example
ExampleExample
Example
유석 남
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
Nam Hyeonuk
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
happychallenge
3. linked list
3. linked list3. linked list
3. linked list
Geunhyung Kim
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2
민석 이
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
동윤 이
파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기
Yong Joon Moon
Python Programming: Function
Python Programming: FunctionPython Programming: Function
Python Programming: Function
Chan Shik Lim
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
Terry Cho
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조
영기 김
R 기본-데이타형 소개
R 기본-데이타형 소개R 기본-데이타형 소개
R 기본-데이타형 소개
Terry Cho
R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작
Terry Cho
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
happychallenge
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2
민석 이
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
동윤 이
파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기
Yong Joon Moon

하스켈 모나드

  • 7. 하스켈의 특징 ● Pure function ● High order function ● Polymorphism ● Lazy evaluation ● Type class ● Monad 왜 하스켈은 이런 특징을 가지는가?
  • 8. 소프트웨어 공학적 접근 재사용(Reusability) ● 이미 만들어진 설계, 코드, 테스트, 문서 등을 재사용할 수 있어야 한다. 분할 정복(divide and conquer) ● 복잡한 문제는 작은 단위로 나눠서 풀고 재조합한다. 그래서 조합성(compositionality)이 중요!
  • 9. 프로그래밍의 본질 ● 프로그래밍 본질은 조합(compositin) ● 바꿔 말해, 복잡한 문제를 분해(decomposition)하고 재조합(recomposition) 하는 일 ○ Category: The Essence of Composition, https://bartoszmilewski. com/2014/11/04/category-the-essence-of-composition/
  • 10. 함수 언어 = 조합 언어 함수 언어의 모든 기능은 조합을 쉽게 하기 위한 방법 ● 다형성 + 고차 함수 = 재사용성 ○ Higher-order + Polymorphic = Reusable, https://kar.kent.ac. uk/21504/3/Higher-order_+_Polymorphic_=_Reusable.pdf ● 지연 연산 = 모듈성 ○ Why Functional Programming Matters, https://www.cs.kent.ac. uk/people/staff/dat/miranda/whyfp90.pdf
  • 11. 표기법 ● 기본 타입: Int, Char, String ● 타입 변수: a, b, c ● 함수 타입: Int -> String, a -> b ● 함수: f, g, h
  • 12. 합수 합성 ● f :: A -> B ● g :: B -> C ● g . f :: A -> C 법칙 ● (f . g) . h = f . (g . h) ● f . id = f ● id . f = f
  • 13. 순수 함수의 합성 > (take 2 . filter (>=3) . map length) [“a”, “ab”, “abc”, “abcd”, “abcde”] [3,4] > map (negate . abs) [5, -3, -6, 7, -3, 2, -19, 24] [-5,-3,-6,-7,-3,-2,-19,-24]
  • 14. 범주(Category) class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c 법칙 ● (f . g) . h = f . (g . h) ● f . id = f ● id . f = f instance Category (->) where id x = x (f . g) x = f (g x)
  • 17. 함수 합성의 장애물 1. 오류 2. 비결정성 3. 콘텍스트 4. IO 5. ...
  • 18. 1. 오류 data Maybe a = Just a | Nothing f :: A -> Maybe B g :: B -> Maybe C g . f :: ?? Maybe를 리턴하는 함수는 (.)로 조합이 불가능
  • 19. 오류 발생 가능한 함수의 조합 return :: (a -> Maybe a) return = Just (<=<) :: (b -> Maybe c) -> (a -> Maybe b) -> (a -> Maybe c) (f <=< g) x = case g x of Just y -> f y Nothing -> Nothing
  • 20. 함수 합성과의 비교 id :: (a -> a) return :: (a -> Maybe a) (.) :: (b -> c) -> (a -> b) -> (a -> c) (<=<) :: (b -> Maybe c) -> (a -> Maybe b) -> (a -> Maybe c) (f . g) x = f (g x) (f <=< g) x = f =<< (g x)
  • 21. 2. 비결정성 data List a = Cons a (List a) | Nil f :: A -> [B] g :: B -> [C] g . f :: ?? 리스트를 리턴하는 함수는 (.)로 조합이 불가능
  • 22. 비결정적 함수의 조합 return :: (a -> [a]) return a = [a] (<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c]) (f <=< g) x = concatMap f (g x)
  • 23. 함수 합성과의 비교 id :: (a -> a ) return :: (a -> [a]) (.) :: (b -> c ) -> (a -> b ) -> (a -> c ) (<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c]) (f . g) x = f (g x) (f <=< g) x = concatMap f (g x)
  • 24. 3. 콘텍스트 f :: A -> (R -> B) g :: B -> (R -> C) g . f :: ?? 콘텍스트를 인자로 받는 함수는 (.)로 조합이 불가능
  • 25. 콘텍스트 함수의 조합 return :: a -> (r -> a) return a = r -> a (<=<) :: (b -> (r -> c)) -> ((a -> (r -> b)) -> (a -> (r -> c)) (f <=< g) x = r -> f ((g x) r) r
  • 26. 함수 합성과의 비교 id :: (a -> a) return :: (a -> (r-> a)) (.) :: (b -> c) -> (a -> b) -> (a -> c) (<=<) :: (b -> (r -> c)) -> (a -> (r -> b)) -> (a -> (r -> c)) (f . g) x = f (g x) (f <=< g) x = r -> f ((g x) r) r
  • 27. 4. IO f :: A -> IO B g :: B -> IO C g . f :: ?? IO 함수는 (.)로 조합이 불가능
  • 28. IO 함수의 조합 return :: (a -> IO a) (<=<) :: (b -> IO c) -> (a -> IO b) -> (a -> IO c)
  • 29. 함수 합성과의 비교 id :: (a -> a) return :: (a -> IO a) (.) :: (b -> c) -> (a -> b) -> (a -> c) (<=<) :: (b -> IO c) -> (a -> IO b) -> (a -> IO c) (f . g) x = f (g x) (f <=< g) x = f =<< (g x)
  • 31. 클라이슬리 범주(Kleisli Category) return :: (Monad m) => (a -> m a) (<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c) newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b } instance Monad m => Category (Kleisli m) where id = Kleisli return (Kleisli f) . (Kleisli g) = Kleisli (f <=< g)
  • 32. 모나드 class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a ● (a >>= f) = (f <=< id) a ● (f <=< g) x = f =<< (g x)
  • 33. 모나드 법칙 범주 법칙 ● return <=< f = f ● f <=< return = f ● (f <=< g) <=< h = f <=< (g <=< h) 모나드 법칙 ● m >>= return = m ● return x >>= f = f x ● m >>= (y -> g y >>= f) = (m >>= g) >>= f
  • 34. 모나드 조합성과 모나드 ● 모나드는 부분 함수, 비결정적 함수, IO 함수 등에 조합성을 주기 위한 프로 그램의 구조라고 이해할 수 있음
  • 35. 모나드의 종류 ● Maybe ● Either ● IO ● Reader ● Writer ● State ● Continuation ● Parser ● Pipe
  • 36. 모나드의 조합성 IO와 State가 동시에 필요하면? ● 모나드는 일반적인 조합이 불가능함 ● 모나드 트랜스포머(Monad Transformer) 사용