2012-05-26 4 views
3

내가 해결하고 싶은 작업에서 시작하겠습니다. 아마도 잘못된 길로 가고 있습니다. 저는 장난감 프로젝트를위한 Snap 프레임 워크를 사용합니다. 그리고 주요한 점은 Snap 모나드 아래의 함수라는 것입니다. 나는 그것 위에 내 상태를 추가해야합니다. 이 모듈, 말, Base에 정의구현 >> = newtype에서

type SnapApp a = StateT AppState Snap a 

: 나는 모나드 변압기를 사용합니다. 내가 다른 모듈에 필요하기 때문에, 나는 그것을 내보낼 수 있습니다

module Base 
    (.. 
    , SnapApp 
) where 

이 좋은,하지만 몇 가지 복잡한 처리를 가지고 있기 때문에 나는 일부 속성을 설정, 해당 모듈이 SnapApp 상태 모나드 있음을 수출하지 않습니다 싶어 주. 예 : 세션. 파일이 변경되었을 때 파일을 써야하기 때문에, 단지 getput 수정 된 세션이 틀리면 특수 함수를 호출해야합니다.

newtype SnapApp a = SnapApp (StateT AppState Snap a) 

내가 그것을 세션 등 그러나 문제를 수정하기위한 기능 내 클래스의 인스턴스를 만들어 발생 : 그래서, newtype 아니라 데이터 내보내기 construstor를 사용하는 것을 숨기기 나는 새로운 SnapApp 다른과 Monad 클래스의 인스턴스를 잃었다 . 그리고 >>= 구현에 붙어 :

instance Monad SnapApp where 
    return = SnapApp . return 
    mx >>= fm = -- HOW? 

감사합니다!

답변

16

유형을 안내해주세요.

  • 인수 SnapApp aa -> SnapApp b
  • 고해상도 a -> StateT AppState Snap b에 인수
  • StateT AppState Snap a에 : 당신은 당신은 변환 할 필요가 당신은

    (>>=) :: StateT AppState Snap a -> (a -> StateT AppState Snap b) -> StateT AppState Snap b 
    

    (>>=) :: SnapApp a -> (a -> SnapApp b) -> SnapApp b 
    

    필요 ult StateT AppState Snap b to SnapApp b

1) 패턴 일치를 사용하십시오. 정의

fromSnapApp (SnapApp x) = x 

2) 함수를 작성 a -> SnapApp bSnapApp b -> StateT AppState b

3) SnapApp

최종 결과 사용

x >>= f = SnapApp (fromSnapApp x >>= (fromSnapApp . f)) 

또는 :

SnapApp x >>= f = SnapApp (x >>= (fromSnapApp . f)) 
0123을

이것을 쓸 필요는 없습니다.

newtype SnapApp a = SnapApp (StateT AppState Snap a) deriving (Monad) 
+0

우수한 설명 주셔서 감사합니다! – demi

3

이 상태 관리는 우리가 당신을 위해 처리 할 수 ​​snaplets 설계 정확히 : 당신이 GeneralizedNewtypeDeriving 확장을 사용하는 경우 GHC는 인스턴스를 유도 할 수있다.Handler 모나드는 실제로는 편의를 위해 몇 가지 추가 사항이있는 StateT s Snap에 대한 새로운 유형의 래퍼입니다. 우리는 당신이 피하려고하는 MonadState 인스턴스를 노출 시키지만, 모듈에 상태 유형을 캡슐화하고 그것에 대한 접근자를 내 보내지 않음으로써 이것을 처리 할 수 ​​있습니다. 모든 복잡한 속성 처리를 수행하는 원하는 Handler 함수 만 내보낼 수 있습니다.

+0

오, 하스켈 초보자이기 때문에 코드를 Handler와 비교할 것입니다. 고맙습니다! – demi

+0

노출 된 API에 편의성을 더하는 복잡한 요소가 많이 있지만 초보자에게는 복잡해 보입니다. 튜토리얼과 API 문서로 시작하는 것이 좋습니다. #snapframework에 들러 인터랙티브하고 깊이있는 질문에 대한 답변을 얻을 수도 있습니다. – mightybyte

관련 문제