하스켈 모나드

38
하스켈 모나드 하스켈 학교 2016412서광열

Upload: kwang-yul-seo

Post on 21-Apr-2017

1.162 views

Category:

Engineering


4 download

TRANSCRIPT

하스켈 모나드하스켈 학교

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. IO5. ...

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

감사합니다