내 이전 목표에 대한 다음과 같은 질문입니다. 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
의 일부가되어서는 안되기 때문에 전체 상태를 수정해야합니까?
Session
을 AppState
과 Editor
으로 올바르게 초기화 한 다음 내 main
에서 실행하는 방법은 무엇입니까?
'StateT '안에'StateT'를 감싸는 것은 올바른 상태에 접근하기 위해 리프트를 어색하게 조합해야합니다. 'StateSt (AppState, EditorState)'(또는 자신의 데이터 타입)을 사용하는 것이 더 좋을 것이므로'MonadState'의'get' 등을 들지 않고 사용할 수 있습니다. –