FP(Functional Programming) - State

cfop·2020년 10월 19일
0

State monad

상태를 설정, 수정, 참고 하여 mapping을 진행할 수 있는 모나드 입니다.

우리는 앞서 reader monad를 볼때 단순히 입력된 상태(config)를 읽어오기만 했는데요, state 모나드는 상태에 따라 다양한 액션을 할 수 있는 모나드 입니다. 상태를 입력 할수도 있고, 수정도 할 수 있고, 상태를 가져와 value를 바꿀수도 있습니다.

const state = { name : null, age : null}

state.name = getName()
state.age = getAge()

getInfo(state)

state를 수정하는 함수는 getName, getAge함수 입니다. state를 읽어서 뭔가 하는것은 get Info 함수 입니다. 이거를 외부의 상태를 가져와 순수성을 깨뜨리기 보다 아래와 같은 것은 어떨지 생각 해보겠습니다.

state({name: null, age : null)}
.map((state) => ...)
.map((state) => ..)
.chian((state) => ..)

뭐 이런식으로는 안될까요? 그걸 가능 하게 하는것이 State 모나드 입니다!

State 모나드의 interface

이 외에 상태를 읽어오고, 쓰고, 수정하고, 상태를 읽어와 value를 바꾸는 헬퍼 함수가 있습니다.

State 모나드는 evalValue와 evalState가 함수 합성이 다 끝나고 마지막에 호출되기 때문에 타입을 정의하는게 너무 어려웠습니다(이게 맞는지 모르겠습니다.) 그래서 함수 이름에 붙은 get, put, modify, gets는 안타깝게도 타입 추론이 안되 직접 타입을 명시 하는 형태로 작성 해놓았습니다.

State 모나드의 구현

Reader 모나드처럼 함수를 받습니다. Reader는 env를 받고, State는 state를 받습니다.
이거를 입력된 state에 따라서 계속 연결하는것 그게 다 입니다.

get는 state를 value로 갖고 옵니다. state가 셋팅 되면 그 상태를 기반으로 value를 초기화 하는 것 입니다.
put은 state를 셋팅하는 것입니다. value가 초기화 됩니다.
modify는 state를 수정하는 것입니다. 기존 state를 받아 새로운 state를 리턴하는 함수를 인자로 받습니다
gets는 state를 이용해 value를 수정하는 것입니다. 기존 state를 받아 새로운 value를 리턴하는 함수를 인자로 받습니다.

map으로는 value를 그냥 바꿀 수 있고, gets로는 state를 읽어다 value를 바꿀수 있는 통로를 열어줬다고 보면 될 것 같습니다.

예제

reader 모나드도 마지막에 config를 넣었듯이 state 모나드도 마지막에 초기 state 값을 넣어 줍니다.

이거는 어디에다 쓸 수 있을까요 .. 유용할 것 같기도 합니다.

mapping 진행 -> 상태 저장 -> 상태 읽어와서 -> 상태를 초기값으로 다시 진행 ->
.. 진행.. mapping진행.. -> 상태 저장 -> 상태 읽어서 value 변경 -> mapping.. mapping..

생각 해봐야겠습니다..

profile
dog발자

0개의 댓글