2016-08-12 4 views
1

내 이전 목표에 대한 다음과 같은 질문입니다. State and IO Monads모나드 트랜스포머 스택을 메인에서 킥 스타트하는 방법은 무엇입니까?

내 목표는 파일을위한 간단한 텍스트 편집기를 만드는 것입니다. 기본 데이터 구조에 모든 편집 작업을 멋지게 캡슐화 한 Editor 구성 요소가 이미 있습니다.

type Session = StateT AppState (StateT Editor IO) 

AppState 응용 프로그램 (현재 열려있는 파일의 전역 상태를 유지 : 지금 멋진 모나드 변압기 스택을 가질 수 있도록 내 앞의 질문에 대한 답변에

덕분에, 나는 내 프로그램을 리팩토링 할 수 있었다 , etc. ...), Editor은 앱의 편집 요소 (캐럿이있는 위치 등)의 내부 상태를 나타냅니다. 나는 실제로 내 main 함수에서 내 변압기 스택을-걷어차 기 시작하는 방법을 모른다 그러나 지금은, 지금까지 너무 좋아

eventLoop :: Session() 

: 나는 응용 프로그램의 기본 드라이버 기능이? 메인은 내 스택 맨 바닥에있는 IO 모나드에 무엇인가를 반환해야합니다.

main = do 
    let initialAppState = ... 
    return $ runStateT eventLoop initialAppState 

그러나 어디 초기화 할 내 Editor 지금 : 내 생각 엔 내 AppState를 초기화해야하고 다음과 같은 일을 할 것입니다?

data AppState = { editor :: Editor , ... } 

하지만 지금은 AppState에서 이동 및 변압기 스택에 형제의 어느 정도가 될 :

나를 혼란 중요한 것은 리팩토링 이전 Editor 단순히 AppState의 일원이다. Editor을 수정하면 AppState의 일부가되어서는 안되기 때문에 전체 상태를 수정해야합니까?

SessionAppStateEditor으로 올바르게 초기화 한 다음 내 main에서 실행하는 방법은 무엇입니까?

+0

'StateT '안에'StateT'를 감싸는 것은 올바른 상태에 접근하기 위해 리프트를 어색하게 조합해야합니다. 'StateSt (AppState, EditorState)'(또는 자신의 데이터 타입)을 사용하는 것이 더 좋을 것이므로'MonadState'의'get' 등을 들지 않고 사용할 수 있습니다. –

답변

2

실제로 주 변압기 스택에서 변압기 스택을 시작할 수 있습니까? 수정은 전반적인 상태를 변경하는 것을 의미하기 때문에

main = 
    flip evalStateT initialAppState $ 
    flip evalStateT initialEditorState $ 
    eventLoop 
    where 
    initialAppState = 
     error "Define me" 
    initialEditorState = 
     error "Define me" 

편집기는 여전히 AppState 서비스의 일부가 될 수 없습니다할까요?

에 달려 있습니다.

Monad Transformer의 목적은 임시로 기능을 확장한다는 것입니다. ad-hoc이란 기존 코드베이스를 다시 작성하지 않고 추가하는 것입니다. 따라서 이미 Editor와 AppState의 API를 분리했다면 트랜스포머 스택을 사용하여 다른 "돔"모듈로 결합하는 것이 더 쉽습니다.

OTOH는 초기 아키텍처 관점에서 볼 때 AppState가 다른 것들 중에서 EditorState라는 이름의 Editor를 포함하는 데이터 구조라는 것을 완전히 이해합니다. 이러한 경우 AppState의 API는 Editor의 API를 캡슐화해야합니다."렌즈"라이브러리는 이러한 복합 데이터 구조로 작업하는 데 많은 도움이됩니다.하지만 가파른 학습 곡선이 있어야합니다.

+0

그것은 다시 당신입니다 :) 고마워, 나는 당신의 도움으로 모든 일을 할 수있었습니다. 나는 한 번 사용하기 전에 이미 렌즈를 사용해 왔지만 개념을 실제로 파악한 적이 없으며 다음에 주제를 찔렀다가 느려지 게하고 싶습니다. – DeX3

+0

당신을 환영합니다) –