FP(Functional Programming) - Maybe

cfop·2020년 10월 12일
1

https://velog.io/@cfop/FPFunctional-Programming-monad
전 글을 참고해 주세요!

Maybe 모나드

값이 있는가, 없는가 상태를 갖고 진행하는 Maybe 모나드 입니다.

M<T> 
-> 생성 할 때 값이 숫자면 Some, 다른 경우는 None 
-> map: parsing 
  -> Some이면 진행
    -> 결과가 Array<String>인가? -> Some 리턴
    -> 결과가 Array<String>이 아닌가? -> None 리턴
  -> None이면 진행X : 끝
-> map : maergeFirstAndLast
  -> Some이면 진행   
    -> 결과과 String인가? -> Some 리턴
    -> 결과가 String이 아닌가? -> None 리턴
  -> None이면 진행X : 끝
-> map : b string process..
  -> Some이면 진행
  -> None이면 진행X : 끝
  
  코드는 이렇게 될 것이다
  
  Maybe(a).map(parsing).map(mergeFirstAndLast).map(bStringProcessing)

전 글에서 퍼왔습니다.
이를 어떻게 구현하는지 보도록 하겠습니다.

Maybe 모나드의 interface


인터페이스를 잘 봐주세요! 모나드 자체가 박스에 넣고, 빼고 계산하고 과정을 총칭 합니다. 여기서 주목 해야 할건
map, flatten, chain 입니다.

map은 모나드 안의 값을 꺼내서 매핑된 함수 f(a -> b) 연산 후 다시 모나드에 넣는 과정 입니다. M a -> (a -> b) -> M b 로 표현 합니다.

flatten은 모나의 안의 값을 꺼내는 것 입니다.

chain은 모나드 안의 값을 꺼내서 매핑된 함수 f와 연산후 다시 모나드로 만드는 것은 map과 똑같으니 f가 (a->b)가 아닌 ( a -> M b) 입니다. 모나드를 리턴 합니다.

Maybe 모나드에 특정하는 개념은 아닙니다. Either 모나드도 같은 개념을 갖습니다.

MaybeFactory 함수의 interface

value가 있는 Some 상태 함수 내용

값이 null이거나 undefined인 nothing 상태 함수 내용

예제

some, nothing 모두 Maybe interface의 구현체 이기 때문에 some, nothing 관계 없이 체이닝이 됩니다. 그러나 some에서 map 함수를 보면 nothing 상태이면 주어진 함수를 실행하지 않고 nothing을 리턴함으로써, 값의 존재와 상관없이 체이닝이 끝까지 진행되게 됩니다.

4가 16이 되고, 16이 18이 되고 18이 23이 됩니다. 여기서 만약에

어떤 로직에 의해 값이 null이 넘어 갔다면 어떻게 될까?
그 뒤로는 mapping된 함수가 실행되지 않고 16이 리턴 되는것을 알 수 있습니다.
undefined도 마찬가지 입니다.

이런 식으로 사용할 수 있어요

의문점

  1. mapping 하는 함수는 파라미터가 항상 1개 인가? 여러 개의 파라미터를 넘길 수 없는가?
  2. mapping 하는 함수가 비동기면 어떻게 하는가?
  3. monadologia는 뭔가?

우선적인 답변

  1. mapping 하는 함수 파라미터는 꼭 1개가 아니어도 됩니다. 방법적으로 가능 하나, map 함수의 파라미터는 어차피 안에 담고 있는 value 이기 때문에 1개 이상의 파라미터를 받을 이유가 없다.

  2. async, await에 대해서 조금 적자면, async 안에서만 await 키워드에 의해 동기적으로 작동합니다. map 안에 Promise를 리턴하는 함수를 매핑한다면 Promise의 상태는 pending으로 두고 바로 Promise를 리턴하여 다음 map 함수를 호출하게 됩니다. map 안에 async 함수를 매핑 하여도 async 함수 자체도 역시 Promise를 리턴하기 때문에 같은 결과가 나타 납니다.

  3. 이 포스팅을 쓰면서 작은 npm 모듈을 만들고 있습니다. 그 이름이 monadologia 입니다. 한글로 번역하면 단자론입니다. 라이프니츠의 저서라고 합니다. 프로그래밍하고는 관련이 적고 신학, 철학 쪽의 출판물입니다.

profile
dog발자

0개의 댓글