티스토리 뷰
Functor, Applicative, Monad.
함수형 패러다임에서 매우 잦게 수행되는 것들이 있다고 합니다. 함수 합성과 커링이 그 예 입니다.
여기서 일반적으로 사용되는 데이터 타입인 Char, Int, Double 을 그대로 사용하면서도 Null 동작에 대한 대비 및 Side-Effect 를 동반하는 함수를 순수하게 다루기 위한 방법 등이 같이 고려되어야 합니다.
그 중 알아낸 개념으로 Functor, Applicative, Monad 에 대해 약술합니다.
Functor(함자)
맵핑 가능하거나 맵핑 되는 대상
조건
1. id 함수(identity function; 항등 함수)를 함자를 통해 맵핑하여 리턴된 함자는 원래의 함자와 동일해야 한다. fmap id = id
2. 두 함수를 합성한 함수를 함자를 통해 맵핑하여 얻은 결과는 첫 함수를 먼저 함자에 맵핑하고 이 결과를 다른 함수와 함자에 맵핑한 결과와 같아야 한다. fmap (f . g) = fmap f . fmap g.
Applicative(적용성 함자)
함수와 그 정의역을 받아 함수에 정의역을 적용한 결과값을 리턴하는 함수
조건
1. 문맥상의 값과 문맥상의 항등함수를 적용성 함자에 적용하면 그 결과는 문맥상의 값이다. (Identity law) pure id <*> v = v
2. 적용성 함자 적용에 결합법칙이 성립해야 한다. (Composition law) pure (.) <*> u <*> v <*> w = u <*> ( v <*> w )
3. 문맥상의 함수와 문맥상의 값을 적용성 함자를 통해 적용한 결과는 함수에 값을 적용해 얻은 값이 문맥에 포함된 결과와 같아야 한다. (Homomorphism law) pure f <*> pure x = pure ( f x )
4. 적용성 함자를 문맥상의 값에 적용한 결과는 문맥상의 값을 인자로 받는 함수에 적용성 함자를 적용한 결과와 같아야 한다. (Interchange law) u <*> pure y = pure (& y) <*> u
Monad(모나드)
단항 제네릭 타입의 모노이드
조건
1. Left identity : 모노딕 값을 함수에 바인딩한 결과는 함수에 값을 적용한 결과와 같다. return x >>= f equals f x
2. Right Idnentity : 모노딕 값을 모노딕화 함수에 적용한 결과는 그저 모노딕 값과 같다. m >>= return equals m
3. Associativity : 모나딕 값을 함수 f 에 바인딩 한 결과를 함수 g 에 바인딩 한 결과는 함수 f를 함수 g에 바인딩 한 결과에 모노딕 값을 적용한 결과와 같다. (m >>= f) >>= g equals m >>= (\x -> f x >>= g)
발표에 쓸 자료
1.
참고자료
- http://learnyouahaskell.com/functors-applicative-functors-and-monoids
- http://learnyouahaskell.com/a-fistful-of-monads
- https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
- https://dev.to/ingun37/monad-monoid-40if
- https://en.wikibooks.org/wiki/Haskell/Applicative_functors
- https://medium.com/angular-in-depth/functional-programming-in-simple-terms-abcef30a2ad1
- https://www.codingame.com/playgrounds/6272/building-a-maybe-in-javascript
- https://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-pipe-c80dc7b389de
- https://teamdable.github.io/techblog/Moand-and-Functional-Architecture
- https://en.wikibooks.org/wiki/Haskell/Understanding_monads/State
- https://commons.wikimedia.org/wiki/File:State_Monad_Bind.svg
- https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80
- https://crypto.stanford.edu/~blynn/haskell/io.html
- https://www.futurelearn.com/info/courses/functional-programming-haskell/0/steps/27205