2012-01-25 6 views
2

シンプルなニーズのために、私はイエロータイプを手元に置いていると思いました。ハ! ここでコンパイルする2つの関数はありますが、現時点で私が望むものとまったく同じものではありません。マッチングタイプ: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 

私はそれをコメント解除し、またはgetCurrentTimeに呼び出した場合、私は下に表示されますエラーを取得し、理由コメントアウトaddNoteの型シグネチャを持っています。

addNote'の種類がわかりません。 GHCが、それは次のようであると言う:

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の種類はこれですと言う:

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

ここで私はgetUTCTime行をコメント解除した場合、私は取得エラー、または型シグネチャがあります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

この解決策は、昨夜の青から私に届いた、私はこれが簡単だったと思っていた。 –