2012-01-25 3 views
2

나는 단순한 요구를 위해 Yesod 유형을 잘 알고 있다고 생각했습니다. 하! 지금 컴파일하는 두 가지 기능이 있지만 현재 내가 원하는 기능을 제대로 수행하지 못하고 진행 방법을 잘 모르겠습니다. 내가 주석을 제거하거나 getCurrentTime에 대한 호출이, 내가 아래에 표시됩니다 오류가 발생하는 경우일치 유형 : Befuddlement

addNote' selectedProduct = do 
     _ <- runDB $ insert <=< liftIOHandler $ addNote selectedProduct 
     return() 


-- addNote :: SelectedProduct -> IO (NotesGeneric SqlPersist) 
addNote (MKsp tid firmware version _ requester (Textarea note)) = do 
-- currentTime <- getCurrentTime 
    return $ Notes tid requester firmware version note undefined 

가 나는 이유 주석 addNote의 유형 서명을해야합니다.

addNote'의 형식이 무엇인지 알 수 없습니다. 나는 getUTCTime 선 또는 유형 서명을 주석을 제거하면 다음

  addNote :: forall (m :: * -> *). 
         Monad m => 
         SelectedProduct -> m (NotesGeneric SqlPersist) 

은 내가 오류입니다 : 또한

Warning: Top-level binding with no type signature: 
       addNote' :: forall master (monad :: * -> *) sub sub1 master1. 
          (YesodPersistBackend master 
           ~ 
          Control.Monad.Trans.Reader.ReaderT (HandlerData sub1 master1), 
          YesodPersist master, 
          PersistBackend 
           (Control.Monad.Trans.Reader.ReaderT (HandlerData sub1 master1)) 
           (GGHandler sub master IO), 
          Control.Monad.IO.Class.MonadIO monad) => 
          SelectedProduct 
          -> Control.Monad.Trans.Reader.ReaderT 
           (HandlerData sub master) monad() 

, GHC는 addNote의 유형이 말한다 : GHC은 다음을 말한다 addNote입니다.

Couldn't match expected type `Control.Monad.Trans.Reader.ReaderT 
           (HandlerData sub0 master0) IO b0' 
      with actual type `IO (NotesGeneric SqlPersist)' 
Expected type: GGHandler sub0 master0 IO b0 
    Actual type: IO (NotesGeneric SqlPersist) 
In the return type of a call of `addNote' 
In the second argument of `($)', namely `addNote selectedProduct' 

일치하는 유형을 얻으려면 어떻게해야합니까?

답변

1

liftIOHandlerliftIO으로 바꿉니다. liftIOHandler은 매우 드문 경우에만 필요한 더러운 해킹이며, 다행스럽게도 Yesod 0.10부터 완전히 사라졌습니다.

+0

어젯밤에이 솔루션이 나에게 파란색으로 나왔습니다. 나는 이것이 간단하기를 바랬습니다. –