메인에서 모나드 트랜스포머 스택을 킥 스타트하는 방법은 무엇입니까?

DeX3

이 질문은 이전 질문에 대한 후속 질문입니다. State 및 IO Monads

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

이전 질문에 대한 답변 덕분에 프로그램을 리팩터링하여 이제 멋진 모나드 변환기 스택을 얻을 수있었습니다.

type Session = StateT AppState (StateT Editor IO)

AppState응용 프로그램의 전역 상태 (현재 열린 파일 등) Editor를 보유하고 앱 편집 구성 요소의 내부 상태 (캐럿이있는 위치 등)를 나타냅니다. 응용 프로그램의 주요 동인 기능이 있습니다.

eventLoop :: Session ()

지금까지는 훌륭했지만, main함수 에서 트랜스포머 스택을 실제로 시작하는 방법을 모르겠습니다 . Main은 IO내 스택의 맨 밑에 있는 모나드 에서 무언가를 반환해야합니다 . 내 생각 엔 초기화 AppState하고 다음과 같은 작업을 수행해야합니다.

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

하지만 Editor지금 어디에서 초기화 합니까?

저를 혼란스럽게하는 가장 중요한 점은 리팩토링 전에 Editor단순히 다음의 멤버였습니다 AppState.

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

그러나 이제는 AppState트랜스포머 스택에서 벗어나 약간의 형제가되었습니다. 수정하는 것은 전체 상태를 수정하는 것을 의미하기 때문에 Editor여전히 일부가 되어서는 안 AppState됩니까?

어떻게 제대로 내를 초기화 할 Session모두 AppStateEditor다음 내에서 실행 main?

니키타 볼코프

주 기능에서 트랜스포머 스택을 실제로 시작하는 방법은 무엇입니까?

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

수정하는 것은 전체 상태를 수정하는 것을 의미하기 때문에 에디터는 여전히 AppState의 일부 여야하지 않습니까?

때에 따라 다르지.

Monad Transformer의 목적은 애드혹 방식으로 기능을 확장하는 것임을 기억하십니까? 즉, 기존 코드베이스를 다시 작성하지 않고 추가하는 것입니다. 따라서 Editor 및 AppState의 격리 된 API가 이미있는 경우 변환기 스택을 사용하여 다른 "돔"모듈에 결합하는 것이 더 쉽습니다.

OTOH는 초기 아키텍처 관점에서 볼 때 AppState가 무엇보다도 Editor (EditorState라고 부릅니다)를 포함하는 데이터 구조라는 것이 전적으로 합리적입니다. 이러한 경우 AppState의 API는 Editor의 API를 캡슐화해야합니다. "렌즈"라이브러리는 이러한 복합 데이터 구조로 작업하는 데 많은 도움이 될 것입니다 (비록 학습 곡선이 가파르다는 것을 언급해야합니다).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

킥 스타트 또는 사전 시드 파일에서 도커 이미지를로드하는 방법은 무엇입니까?

분류에서Dev

Red Hat 7.4 : UEFI 전용 시스템 용 USB 미디어에 킥 스타트 파일을 삽입하는 방법은 무엇입니까?

분류에서Dev

킥 스타트 파일에서 $ post 섹션의 순서는 무엇입니까?

분류에서Dev

세 가지 모드에서 버튼 텍스트 스타일을 변경하는 방법은 무엇입니까?

분류에서Dev

GWTTestCase에서 "타이머 코드"를 테스트하는 방법은 무엇입니까?

분류에서Dev

Kleisli는 어떻게 모나드 트랜스포머입니까?

분류에서Dev

포리스트의 모든 도메인을 나열하는 방법은 무엇입니까?

분류에서Dev

Either 모나드의 컨텍스트에서 Data.Map.lookup을 사용하는 방법은 무엇입니까?

분류에서Dev

메서드 내에서 private 메서드를 호출 한 경우 테스트 메서드를 모의하거나 준비하는 방법은 무엇입니까?

분류에서Dev

텍스트 파일의 어디에서나 도메인을 추출하는 방법은 무엇입니까?

분류에서Dev

단위 테스트시 모의 인스턴스 메서드에서 개체 인스턴스에 액세스하는 방법은 무엇입니까?

분류에서Dev

이름 기반 가상 호스트에서 하위 도메인을 만드는 방법은 무엇입니까?

분류에서Dev

R에서 랜덤 포레스트 모델을 사용하여 반응 표면을 만드는 방법은 무엇입니까?

분류에서Dev

다른 포드에서 포드 호스트 이름을 확인하는 방법은 무엇입니까?

분류에서Dev

파이 게임에서 주어진 스프라이트를 친 후 게임 내 타이머 스토퍼를 코딩하는 방법은 무엇입니까? 내가 아직 메인 메뉴에 있는데 왜 타이머가 실행 되나요?

분류에서Dev

포인트 프리 스타일로 바인드 함수를 작성하는 방법은 무엇입니까?

분류에서Dev

DataGrid에서 모두 선택 버튼의 스타일을 지정하는 방법은 무엇입니까?

분류에서Dev

선택한 옵션에 따라 인스턴스 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

Spring Integration Java DSL 단위 테스트-Service Activator 클래스 또는 기타 구성 요소 / 엔드 포인트를 모의하는 방법은 무엇입니까?

분류에서Dev

jUnit의 콘솔에 인쇄되는 void 메서드를 테스트하는 방법은 무엇입니까?

분류에서Dev

선택 드롭 다운에서 "옵션"값의 스타일을 지정하는 방법은 무엇입니까?

분류에서Dev

하나의 컨트롤에 여러 스타일을 정의하는 방법은 무엇입니까?

분류에서Dev

모든 프로토 타입 메서드의 시작 부분에 자바 스크립트 코드를 삽입하는 방법은 무엇입니까?

분류에서Dev

TaskT를 Trampoline의 모나드 인스턴스와 결합하여 스택리스 비동기 계산을 얻는 방법은 무엇입니까?

분류에서Dev

vb 스크립트에서 SendKeys 메서드를 사용하여 페이지의 모든 것을 선택하는 방법은 무엇입니까?

분류에서Dev

스택에서 사용하는 메모리 양을 측정하는 방법은 무엇입니까?

분류에서Dev

Google 스프레드 시트에서 타임 스탬프를 계산하는 방법은 무엇입니까?

분류에서Dev

배포 된 서비스 엔드 포인트를 테스트하는 방법은 무엇입니까?

분류에서Dev

배포 된 서비스 엔드 포인트를 테스트하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    킥 스타트 또는 사전 시드 파일에서 도커 이미지를로드하는 방법은 무엇입니까?

  2. 2

    Red Hat 7.4 : UEFI 전용 시스템 용 USB 미디어에 킥 스타트 파일을 삽입하는 방법은 무엇입니까?

  3. 3

    킥 스타트 파일에서 $ post 섹션의 순서는 무엇입니까?

  4. 4

    세 가지 모드에서 버튼 텍스트 스타일을 변경하는 방법은 무엇입니까?

  5. 5

    GWTTestCase에서 "타이머 코드"를 테스트하는 방법은 무엇입니까?

  6. 6

    Kleisli는 어떻게 모나드 트랜스포머입니까?

  7. 7

    포리스트의 모든 도메인을 나열하는 방법은 무엇입니까?

  8. 8

    Either 모나드의 컨텍스트에서 Data.Map.lookup을 사용하는 방법은 무엇입니까?

  9. 9

    메서드 내에서 private 메서드를 호출 한 경우 테스트 메서드를 모의하거나 준비하는 방법은 무엇입니까?

  10. 10

    텍스트 파일의 어디에서나 도메인을 추출하는 방법은 무엇입니까?

  11. 11

    단위 테스트시 모의 인스턴스 메서드에서 개체 인스턴스에 액세스하는 방법은 무엇입니까?

  12. 12

    이름 기반 가상 호스트에서 하위 도메인을 만드는 방법은 무엇입니까?

  13. 13

    R에서 랜덤 포레스트 모델을 사용하여 반응 표면을 만드는 방법은 무엇입니까?

  14. 14

    다른 포드에서 포드 호스트 이름을 확인하는 방법은 무엇입니까?

  15. 15

    파이 게임에서 주어진 스프라이트를 친 후 게임 내 타이머 스토퍼를 코딩하는 방법은 무엇입니까? 내가 아직 메인 메뉴에 있는데 왜 타이머가 실행 되나요?

  16. 16

    포인트 프리 스타일로 바인드 함수를 작성하는 방법은 무엇입니까?

  17. 17

    DataGrid에서 모두 선택 버튼의 스타일을 지정하는 방법은 무엇입니까?

  18. 18

    선택한 옵션에 따라 인스턴스 메서드를 호출하는 방법은 무엇입니까?

  19. 19

    Spring Integration Java DSL 단위 테스트-Service Activator 클래스 또는 기타 구성 요소 / 엔드 포인트를 모의하는 방법은 무엇입니까?

  20. 20

    jUnit의 콘솔에 인쇄되는 void 메서드를 테스트하는 방법은 무엇입니까?

  21. 21

    선택 드롭 다운에서 "옵션"값의 스타일을 지정하는 방법은 무엇입니까?

  22. 22

    하나의 컨트롤에 여러 스타일을 정의하는 방법은 무엇입니까?

  23. 23

    모든 프로토 타입 메서드의 시작 부분에 자바 스크립트 코드를 삽입하는 방법은 무엇입니까?

  24. 24

    TaskT를 Trampoline의 모나드 인스턴스와 결합하여 스택리스 비동기 계산을 얻는 방법은 무엇입니까?

  25. 25

    vb 스크립트에서 SendKeys 메서드를 사용하여 페이지의 모든 것을 선택하는 방법은 무엇입니까?

  26. 26

    스택에서 사용하는 메모리 양을 측정하는 방법은 무엇입니까?

  27. 27

    Google 스프레드 시트에서 타임 스탬프를 계산하는 방법은 무엇입니까?

  28. 28

    배포 된 서비스 엔드 포인트를 테스트하는 방법은 무엇입니까?

  29. 29

    배포 된 서비스 엔드 포인트를 테스트하는 방법은 무엇입니까?

뜨겁다태그

보관