2017-09-12 1 views
1

사용자가 로그인했는지 여부를 추적해야하는 기능적 프로그래밍 스타일의 코드를 작성하고 싶습니다. 나는 불변의 방식으로 일을해야한다고 생각합니다.기능 프로그래밍의 상태 변경

다음의 의사 코드는 기능적으로 보입니다. 상태를 취해 그 역의 값을 돌려줍니다. 그것은 부작용 내 논리 어딘가에

changeState(Boolean state){ 
return !state 
} 

을 가지고 있지되면 사용자가 로그인 (또는 로그 아웃), I 상태에서 로그인 한 것이 현재의 값을 전달 위의 함수를 호출 할 수 있습니다. 나는 기능적으로 로그인 상태를 저장하는 방법을 생각할 수 없다. currentLoggedState가 val이기 때문에 잘못되었습니다.

val currentLoggedState = false; 

    //user entered login details correctly, change state 

    currentLoggedState = changeState(currentLoggedState) 

어떻게 이러한 논리를 기능적 방법으로 작성할 수 있습니까?

+0

이 스레드는 가치가 있습니다 : [얼랭에서 상태를 유지하는 방법은?] (https://stackoverflow.com/questions/26713811/how-to-maintain-state-in-erlang), 구체적으로 시작하는 예제 "파스칼의 답을 되풀이하자면, 매우 제한된 방식으로 : '루프 (상태) 수신' – jq170727

답변

1

상태를 피할 수 없습니다. 기능적 프로그래밍의 포인트는 더 나은 추론을 가능하게하고 프로그램에서 순수하게 수학적 모델을 만드는 것이 아닙니다.

예를 들어 데이터베이스는 말 그대로 하나의 거대한 주 저장소입니다. 당신이 생성, 업데이트, 삭제 등을 할 때 당신은 어떤 상태를 조작하고 있습니다.

상태가 불가피한 환경 (예 : akka 배우 모델)이 있습니다. 행위자와 함께 사소한 시스템을 구현해보십시오. 여러분의 배우가 목록과 해시 맵으로 가득차 있다는 것을 보장합니다. 어느 시점에서는 불가피하게된다. 예를 들어, "Reactive programming"(스칼라의 FP Design으로 이름이 바뀌 었습니다)이라는 EPFL의 호의하에 Coursera 과정이 진행된 경우에도 Roland Kuhn 자신이 보유한 섹션이 있었으며 배우들과 코스 배정은 국가의 몫이었습니다. 스칼라 공동체에 권위있는 사람들이 있는데 때로는 국가를 피할 수 없다는 것을 알려주고 있습니다.

상황에 따라 Redis 또는 유사한 저장소로 푸시하면 상태가 코드 자체에 나타나지 않도록 할 수 있습니다 (변경 사항 만이 지속성 레이어/저장소가됩니다).