2014-09-12 2 views
0

나는 RWST 모나드를 가지고 있으며 generic 함수가 Writer 부분과 상호 작용하는 함수가 있습니다. 참고로이 ghci의 서명을 컴파일하기 위해 수행 할 수있는 작업

, RWST이 같은 경우 : DefWriter 날에 의해 단지 type DefWriter = Seq Error(오류가 정의되어 있습니다

type Definition = RWS SapphireReader DefWriter DefState 

:

newtype RWST r w s m a = RWST {runRWST :: r -> s -> m (a, s, w)} 
instance (Monoid w, Monad m) => Monad (RWST r w s m) 
instance Functor m => Functor (RWST r w s m) 
instance (Monoid w, MonadFix m) => MonadFix (RWST r w s m) 
instance (Monoid w, MonadPlus m) => MonadPlus (RWST r w s m) 
instance Monoid w => MonadTrans (RWST r w s) 
instance (Monoid w, MonadIO m) => MonadIO (RWST r w s m) 
instance (Monoid w, Monad m) => MonadWriter w (RWST r w s m) 
instance (Monad m, Monoid w) => MonadState s (RWST r w s m) 
instance (Monad m, Monoid w) => MonadReader r (RWST r w s m) 
instance (Monoid w, Monad m) => MonadRWS r w s (RWST r w s m) 

그래서 내가 가진이처럼 데이터 Definition , 아니 Control.Monad.Error 하나). 내가 ghci에서 파일을로드하고 :t tellPError을하고, 서명을 제거 시도,

tellPError :: Position -> ParseError -> Definition() 
tellPError posn err = tell (singleton $ PError posn err) 

지금 나는 새로운 RWST을 필요로하고 일반적인 tellPError를 원하는 :

나는 작업 기능을했다.

λ :t tellPError 
tellPError :: MonadWriter (Seq Error.Error) m => Position -> ParseError -> m() 

나는 코드에 서명, 그것은 컴파일되지 않습니다 내 기능을 제공하려고 :

Non type-variable argument 
     in the constraint: MonadWriter (Seq Error) m 
    (Use -XFlexibleContexts to permit this) 
    In the type signature for `tellPError': 
     tellPError :: MonadWriter (Seq Error) m => 
        Position -> ParseError -> m() 

난 정말이 플래그가 필요하십니까? 나는 그것을 시도하고 컴파일했지만 작동하지 않을 것이다.

tellPError :: Position -> ParseError -> RWS r (Seq Error) s() 
tellPError posn err = tell (singleton $ PError posn err) 

컴파일 :

답변

2

문제는 하스켈의 2010 보고서 섹션 4.1.24.1.3에 따라, 클래스 제약의 형식이어야한다는 것입니다 : qtycls 클래스 이름이

class → qtycls tyvar 
     | qtycls (tyvar atype1 … atypen)  (n ≥ 1) 

, tyvar이 형태 변수이며 atype입니다 , 기본적으로, 거의 모든 유형. 그러나 두 규칙의 형식은 qtycls (? tyvar ...입니다.

MonadWriter (Seq Error.Error) m 

형태이다 :

qtycls (gtycon1 gtycon2) tyvar 

따라서 에러 : 그 서명이 제약 조건을 포함하지만

gtycon1 S 형 변수 아닌 타입 생성자이어야한다. 해당 제한을 표현하려면 -XFlexibleContexts 확장자를 사용해야합니다.

다른 대안은 어느 모나드을 지정하여 다형성을 줄이는 것입니다.

0

좋아, 내가 트릭을 할 듯 =>의 오른쪽에 RWS입니다 지금이 문제를보고 그 지정의 아이디어를 내놓았다 봤는데 어떻게해야 하는가?

관련 문제